Wechat:尤而小屋
作者:Peter
編輯:Peter
大家好哑子,我是Peter~
今天繼續(xù)帶來(lái)Pandas的花樣取數(shù)技巧宁舰,本文中重點(diǎn)介紹的方法:
- 表達(dá)式取數(shù)
- query、evel
- filter
- where、mask
模擬數(shù)據(jù)
下面是完全模擬的一份數(shù)據(jù)霎褐,包含:姓名、性別混移、年齡祠墅、數(shù)學(xué)、語(yǔ)文歌径、總分毁嗦、地址共7個(gè)字段信息。
import pandas as pd
import numpy as np
df = pd.DataFrame({
"name":['小明','小王','張菲','關(guān)宇','孫小小','王建國(guó)','劉蓓'],
"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ū)",
"湖南省長(zhǎng)沙市雨花區(qū)",
"北京市東城區(qū)",
"廣東省廣州市白云區(qū)",
"湖北省武漢市江夏區(qū)",
"廣東省深圳市龍華區(qū)"
]
})
df
下面開(kāi)始詳細(xì)介紹5種取數(shù)方法:
- 表達(dá)式取數(shù)
- query()取數(shù)
- eval()取數(shù)
- filter()取數(shù)
- where/mask取數(shù)
表達(dá)式取數(shù)
表達(dá)式取數(shù)指的是通過(guò)表達(dá)式來(lái)指定一個(gè)或者多個(gè)篩選條件來(lái)取數(shù)回铛。
1狗准、指定一個(gè)數(shù)學(xué)表達(dá)式
# 1、數(shù)學(xué)表達(dá)式
df[df['math'] > 125]
2茵肃、取反操作
取反操作是通過(guò)符號(hào)~來(lái)實(shí)現(xiàn)的
# 2腔长、取反操作
df[~(df['sex'] == '男')] # 取出不是男生的數(shù)據(jù)
3、指定某個(gè)屬性的值為具體的數(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ù)
使用說(shuō)明
??在使用的時(shí)候需要注意的是:如果我們列屬性中存在空格,我們需要使用反引號(hào)將其括起來(lái)再進(jìn)行使用紊婉。
使用案例
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)') # 兩個(gè)不等式
2、使用字符型表達(dá)式
df.query('sex != "女"') # 不等于女喻犁,就是全部男
df.query('sex not in ("女")') # 不在女中就是男
df.query('sex in ("男","女")') # 性別在男女中就是全部人
3槽片、傳入變量;變量在使用的時(shí)候需要在前面加上@
# 設(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可以對(duì)列名或者行名進(jìn)行篩選慨蛙,使用方法:
- 直接指定
- 正則指定
- 模糊指定
其中axis=1指定列名辽聊;axis=0指定索引
使用說(shuō)明
使用案例
1、直接指定屬性名
df.filter(items=["chinese","score"]) # 列名操作
直接指定行索引
df.filter(items=[2,4],axis=0) # 行篩選
2期贫、通過(guò)正則指定
df.filter(regex='a',axis=1) # 列名中包含
df.filter(regex='^s',axis=1) # 列名以s開(kāi)始
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
# 同時(shí)指定列名和索引
df.filter(regex='^a',axis=1).filter(like='2',axis=0)
where和mask函數(shù)
where和mask函數(shù)是一對(duì)相反的函數(shù),取出來(lái)的結(jié)果剛好是相反的:
- where:取出滿足要求的數(shù)據(jù)通砍,不滿足的顯示為NaN
- mask:取出不滿足要求的數(shù)據(jù)玛臂,滿足的顯示為NaN
兩種方法都可以將將NaN值設(shè)置我們指定的數(shù)據(jù)
where使用
s = df["score"]
s
# where:滿足條件的直接顯示,不滿足的顯示為NaN
s.where(s>=600)
我們可以給不滿足要求的數(shù)據(jù)進(jìn)行賦值:
# 我們可以給不滿足的進(jìn)行賦值
s.where(s>=610,600) # 不滿足條件的賦值為600
看看兩組結(jié)果的對(duì)比:
where函數(shù)還可以指定多個(gè)條件:
# 符合條件的返回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] 效果相同
mask函數(shù)
mask函數(shù)獲取到的結(jié)果和where是相反的
s.mask(s>=600) # 和where相反:返回的都是小于600的數(shù)據(jù)
s.mask(s>=610, 600) # 不滿足條件的賦值為600
mask函數(shù)接受多個(gè)條件:
# 取值和where相反
df[(df.mask((df.sex=='男') & (df.math > 125)) == df).sex]
總結(jié)
Pandas中取數(shù)的方法真的五花八門迹冤,太多技巧可以獲取到我們想要的數(shù)據(jù)讽营,有時(shí)候不同的方式也可以得到相同的數(shù)據(jù)。本文中著重介紹的通過(guò)表達(dá)式和5個(gè)函數(shù)來(lái)取數(shù)叁巨,下篇文章中將會(huì)重點(diǎn)講解3對(duì)函數(shù)篩選數(shù)據(jù)的方法斑匪。