今天繼續帶來 Pandas 的花樣取數技巧,本文中重點介紹的方法:
下面是完全模擬的一份數據,包含:姓名、性別、年齡、數學、語文、總分、地址共 7 個欄位信息。
import pandas as pd
import numpy as np
df = pd.DataFrame({
"name":['小明','小王','張菲','關宇','孫小小','王建國','劉蓓'],
"sex":['男','女','女','男','女','男','女'],
"age":[20,23,18,21,25,21,24],
"math":[120,130,118,120,102,140,134],
"chinese":[100,130,140,120,149,111,118],
"score":[590,600,550,620,610,580,634],
"address":["廣東省深圳市南山區",
"北京市海澱區",
"湖南省長沙市雨花區",
"北京市東城區",
"廣東省廣州市白雲區",
"湖北省武漢市江夏區",
"廣東省深圳市龍華區"
]
})
df下面開始詳細介紹 5 種取數方法:
二、表達式取數表達式取數指的是通過表達式來指定一個或者多個篩選條件來取數。
1、指定一個數學表達式
# 1、數學表達式
df[df['math'] > 125]2、取反操作
取反操作是通過符號~來實現的
# 2、取反操作
df[~(df['sex'] == '男')] # 取出不是男生的數據3、指定某個屬性的值為具體的數據
# 3、指定具體數據
df[df.sex == '男'] # 等同於 df[df['sex'] == '男']4、不等式表達式
# 4、比較表達式
df[df['math'] > df['chinese']]5、邏輯運算符
# 5、邏輯運算符
df[(df['math'] > 120) & (df['chinese'] < 140)]
三、query()函數 3.1 使用說明⚠️在使用的時候需要注意的是:如果我們列屬性中存在空格,我們需要使用反引號將其括起來再進行使用。
3.2 使用案例1、使用數值型表達式
df.query('math > chinese > 110')df.query('math + chinese > 255')df.query('math == chinese')df.query('math == chinese > 120')df.query('(math > 110) and (chinese < 135)') # 兩個不等式2、使用字符型表達式
df.query('sex != "女"') # 不等於女,就是全部男df.query('sex not in ("女")') # 不在女中就是男df.query('sex in ("男","女")') # 性別在男女中就是全部人3、傳入變量;變量在使用的時候需要在前面加上@
# 設置變量
a = df.math.mean()
a
df.query('math > @a + 10')df.query('math < (`chinese` + @a) / 2')
四、eval()函數eval函數的使用方法和query函數是相同的
1、使用數值型表達式
# 1、數值型表達式
df.eval('math > 125') # 得到的是bool表達式df[df.eval('math > 125')]df[df.eval('math > 125 and chinese < 130')]2、字符型表達式
# 2、字符型表達式
df[df.eval('sex in ("男")')]3、使用變量
# 3、使用變量
b = df.chinese.mean() # 求均值
df[df.eval('math < @b+5')]
五、filter函數我們使用filter可以對列名或者行名進行篩選,使用方法:
其中axis=1指定列名;axis=0指定索引
5.1 使用說明5.2 使用案例1、直接指定屬性名
df.filter(items=["chinese","score"]) # 列名操作直接指定行索引
df.filter(items=[2,4],axis=0) # 行篩選2、通過正則指定
df.filter(regex='a',axis=1) # 列名中包含df.filter(regex='^s',axis=1) # 列名以s開始df.filter(regex='e$',axis=1) # 列名以e結束df.filter(regex='3$',axis=0) # 行索引包含33、模糊指定
df.filter(like='s',axis=1) # 列名中包含sdf.filter(like='2',axis=0) # 行索引包含2# 同時指定列名和索引
df.filter(regex='^a',axis=1).filter(like='2',axis=0)
六、where和mask函數where和mask函數是一對相反的函數,取出來的結果剛好是相反的:
where:取出滿足要求的數據,不滿足的顯示為NaNmask:取出不滿足要求的數據,滿足的顯示為NaN兩種方法都可以將將NaN值設置我們指定的數據
6.1 where使用s = df["score"]
s# where:滿足條件的直接顯示,不滿足的顯示為NaN
s.where(s>=600)我們可以給不滿足要求的數據進行賦值:
# 我們可以給不滿足的進行賦值
s.where(s>=610,600) # 不滿足條件的賦值為600看看兩組結果的對比:
where函數還可以指定多個條件:
# 符合條件的返回True,不符合的返回False
df.where((df.sex=='男') & (df.math > 125))選出我們想要的數據:
df[(df.where((df.sex=='男') & (df.math > 125)) == df).name]
# df[(df.where((df.sex=='男') & (df.math > 125)) == df).sex] 效果相同
6.2 mask函數mask函數獲取到的結果和where是相反的
s.mask(s>=600) # 和where相反:返回的都是小於600的數據s.mask(s>=610, 600) # 不滿足條件的賦值為600mask函數接受多個條件:
# 取值和where相反
df[(df.mask((df.sex=='男') & (df.math > 125)) == df).sex]
七、總結Pandas中取數的方法真的五花八門,太多技巧可以獲取到我們想要的數據,有時候不同的方式也可以得到相同的數據。本文中著重介紹的通過表達式和5個函數來取數,下篇文章中將會重點講解3對函數篩選數據的方法。