五花八門的 Pandas 篩選數(shù)據(jù)
今天繼續(xù)帶來 Pandas 的花樣取數(shù)技巧,本文中重點介紹的方法:
表達(dá)式取數(shù) query、evel filter where、mask
一、模擬數(shù)據(jù)
下面是完全模擬的一份數(shù)據(jù),包含:姓名、性別、年齡、數(shù)學(xué)、語文、總分、地址共 7 個字段信息。
import pandas as pd
import numpy as np
df = pd.DataFrame({
"name":['小明','小王','張菲','關(guān)宇','孫小小','王建國','劉蓓'],
"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":["廣東省深圳市南山區(qū)",
"北京市海淀區(qū)",
"湖南省長沙市雨花區(qū)",
"北京市東城區(qū)",
"廣東省廣州市白云區(qū)",
"湖北省武漢市江夏區(qū)",
"廣東省深圳市龍華區(qū)"
]
})
df

下面開始詳細(xì)介紹 5 種取數(shù)方法:
表達(dá)式取數(shù) query()取數(shù) eval()取數(shù) filter()取數(shù) where/mask取數(shù)
二、表達(dá)式取數(shù)
表達(dá)式取數(shù)指的是通過表達(dá)式來指定一個或者多個篩選條件來取數(shù)。
1、指定一個數(shù)學(xué)表達(dá)式
# 1、數(shù)學(xué)表達(dá)式
df[df['math'] > 125]

2、取反操作
取反操作是通過符號~來實現(xiàn)的
# 2、取反操作
df[~(df['sex'] == '男')] # 取出不是男生的數(shù)據(jù)
3、指定某個屬性的值為具體的數(shù)據(jù)
# 3、指定具體數(shù)據(jù)
df[df.sex == '男'] # 等同于 df[df['sex'] == '男']

4、不等式表達(dá)式
# 4、比較表達(dá)式
df[df['math'] > df['chinese']]

5、邏輯運(yùn)算符
# 5、邏輯運(yùn)算符
df[(df['math'] > 120) & (df['chinese'] < 140)]

三、query()函數(shù)
3.1 使用說明

??在使用的時候需要注意的是:如果我們列屬性中存在空格,我們需要使用反引號將其括起來再進(jìn)行使用。
3.2 使用案例
1、使用數(shù)值型表達(dá)式
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、使用字符型表達(dá)式
df.query('sex != "女"') # 不等于女,就是全部男

df.query('sex not in ("女")') # 不在女中就是男

df.query('sex in ("男","女")') # 性別在男女中就是全部人

3、傳入變量;變量在使用的時候需要在前面加上@
# 設(shè)置變量
a = df.math.mean()
a
df.query('math > @a + 10')

df.query('math < (`chinese` + @a) / 2')

四、eval()函數(shù)
eval函數(shù)的使用方法和query函數(shù)是相同的
1、使用數(shù)值型表達(dá)式
# 1、數(shù)值型表達(dá)式
df.eval('math > 125') # 得到的是bool表達(dá)式

df[df.eval('math > 125')]

df[df.eval('math > 125 and chinese < 130')]

2、字符型表達(dá)式
# 2、字符型表達(dá)式
df[df.eval('sex in ("男")')]

3、使用變量
# 3、使用變量
b = df.chinese.mean() # 求均值
df[df.eval('math < @b+5')]

五、filter函數(shù)
我們使用filter可以對列名或者行名進(jìn)行篩選,使用方法:
直接指定 正則指定 模糊指定
其中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結(jié)束

df.filter(regex='3$',axis=0) # 行索引包含3

3、模糊指定
df.filter(like='s',axis=1) # 列名中包含s

df.filter(like='2',axis=0) # 行索引包含2

# 同時指定列名和索引
df.filter(regex='^a',axis=1).filter(like='2',axis=0)

六、where和mask函數(shù)
where和mask函數(shù)是一對相反的函數(shù),取出來的結(jié)果剛好是相反的:
where:取出滿足要求的數(shù)據(jù),不滿足的顯示為NaN mask:取出不滿足要求的數(shù)據(jù),滿足的顯示為NaN
兩種方法都可以將將NaN值設(shè)置我們指定的數(shù)據(jù)
6.1 where使用
s = df["score"]
s

# where:滿足條件的直接顯示,不滿足的顯示為NaN
s.where(s>=600)

我們可以給不滿足要求的數(shù)據(jù)進(jìn)行賦值:
# 我們可以給不滿足的進(jìn)行賦值
s.where(s>=610,600) # 不滿足條件的賦值為600

看看兩組結(jié)果的對比:

where函數(shù)還可以指定多個條件:
# 符合條件的返回True,不符合的返回False
df.where((df.sex=='男') & (df.math > 125))

選出我們想要的數(shù)據(jù):
df[(df.where((df.sex=='男') & (df.math > 125)) == df).name]
# df[(df.where((df.sex=='男') & (df.math > 125)) == df).sex] 效果相同

6.2 mask函數(shù)
mask函數(shù)獲取到的結(jié)果和where是相反的
s.mask(s>=600) # 和where相反:返回的都是小于600的數(shù)據(jù)

s.mask(s>=610, 600) # 不滿足條件的賦值為600

mask函數(shù)接受多個條件:
# 取值和where相反
df[(df.mask((df.sex=='男') & (df.math > 125)) == df).sex]

七、總結(jié)
Pandas中取數(shù)的方法真的五花八門,太多技巧可以獲取到我們想要的數(shù)據(jù),有時候不同的方式也可以得到相同的數(shù)據(jù)。本文中著重介紹的通過表達(dá)式和5個函數(shù)來取數(shù),下篇文章中將會重點講解3對函數(shù)篩選數(shù)據(jù)的方法。
