只需8招,搞定Pandas數(shù)據(jù)篩選與查詢

今天聊聊Pandas數(shù)據(jù)篩選與查詢的一些操作,在數(shù)據(jù)分析的過程中通常要對數(shù)據(jù)進行清洗與處理,而其中比較重要和常見的操作就有對數(shù)據(jù)進行篩選與查詢。
目錄:
1. 案例數(shù)據(jù)預(yù)覽
2. 基礎(chǔ)操作
2.1. 切片[]
2.2. 索引選擇.iloc與.loc
2.3. 元素選擇.iat與.at
2.4. ?get與truncate
3. 進階操作
3.1. 邏輯篩選
3.2. 函數(shù)篩選
3.3. query
3.4. filter
1. 案例數(shù)據(jù)預(yù)覽

本次案例,我們繼續(xù)采用之前用到過的各地區(qū)GDP數(shù)據(jù),數(shù)據(jù)信息大致如下,后臺回復(fù)GDP可以獲取哈。
In?[1]:?import?pandas?as?pd
In?[2]:?df?=?pd.read_excel(r'各地區(qū)生產(chǎn)總值.xlsx')
In?[3]:?df.head()
Out[3]:?
???????地區(qū)????2020年????2019年????2018年????2017年????2016年
0?????北京市??36102.6??35445.1??33106.0??29883.0??27041.2
1?????天津市??14083.7??14055.5??13362.9??12450.6??11477.2
2?????河北省??36206.9??34978.6??32494.6??30640.8??28474.1
3?????山西省??17651.9??16961.6??15958.1??14484.3??11946.4
4??內(nèi)蒙古自治區(qū)??17359.8??17212.5??16140.8??14898.1??13789.3
In?[4]:?df.info()
<class?'pandas.core.frame.DataFrame'>
RangeIndex:?32?entries,?0?to?31
Data?columns?(total?6?columns):
?#???Column??Non-Null?Count??Dtype??
---??------??--------------??-----??
?0???地區(qū)??????32?non-null?????object?
?1???2020年???31?non-null?????float64
?2???2019年???31?non-null?????float64
?3???2018年???31?non-null?????float64
?4???2017年???31?non-null?????float64
?5???2016年???31?non-null?????float64
dtypes:?float64(5),?object(1)
memory?usage:?1.6+?KB
我們看看描述統(tǒng)計情況,然后在后續(xù)做篩選查詢的時候好演示
In?[5]:?df.describe()
Out[5]:?
???????????????2020年??????????2019年?????????2018年?????????2017年?????????2016年
count??????31.000000??????31.000000?????31.000000?????31.000000?????31.000000
mean????32658.551613???31687.758065??29487.661290??26841.819355??24224.148387
std?????26661.811640???25848.652250??24136.181387??22161.575235??20008.278500
min??????1902.700000????1697.800000???1548.400000???1349.000000???1173.000000
25%?????13940.650000???13826.300000??13104.700000??12381.800000??11634.800000
50%?????25115.000000???24667.300000??22716.500000??20210.800000??18388.600000
75%?????42612.500000???41110.350000??37508.750000??33835.250000??30370.250000
max????110760.900000??107986.900000??99945.200000??91648.700000??82163.200000
可以看到,有效數(shù)據(jù)有30多條,為了讓數(shù)據(jù)顯示好一點,我們可以設(shè)置最多顯示6行
In?[6]:?pd.set_option('display.max_rows',?6)?#最多顯示6行
In?[7]:?df
Out[7]:?
??????????地區(qū)????2020年????2019年????2018年????2017年????2016年
0????????北京市??36102.6??35445.1??33106.0??29883.0??27041.2
1????????天津市??14083.7??14055.5??13362.9??12450.6??11477.2
2????????河北省??36206.9??34978.6??32494.6??30640.8??28474.1
..???????...??????...??????...??????...??????...??????...
29???寧夏回族自治區(qū)???3920.5???3748.5???3510.2???3200.3???2781.4
30??新疆維吾爾自治區(qū)??13797.6??13597.1??12809.4??11159.9???9630.8
31???????臺灣省??????NaN??????NaN??????NaN??????NaN??????NaN
[32?rows?x?6?columns]
接下來,我們開始演示數(shù)據(jù)的篩選與查詢吧
2. 基礎(chǔ)操作

一般來說,數(shù)據(jù)篩選有選擇行、列或者指定位置的值等
2.1. 切片[]
切片這玩意就和python的列表數(shù)據(jù)的切片操作很相似
選擇某一列
注意:如果列名為 2020年或者2020 年,則無法采用屬性形式,因為這種操作的變量名不能以數(shù)字開頭或存在空格
df['地區(qū)']??#?切片形式
Out[8]:?
0??????????北京市
1??????????天津市
2??????????河北省
??
29?????寧夏回族自治區(qū)
30????新疆維吾爾自治區(qū)
31?????????臺灣省
Name:?地區(qū),?Length:?32,?dtype:?object
In?[9]:?df.地區(qū)??#?屬性形式
Out[9]:?
0??????????北京市
1??????????天津市
2??????????河北省
????????...???
29?????寧夏回族自治區(qū)
30????新疆維吾爾自治區(qū)
31?????????臺灣省
Name:?地區(qū),?Length:?32,?dtype:?object
In?[10]:?#?如果列名為?2020年或者2020?年,則無法采用屬性形式,因為這種操作的變量名不能以數(shù)字開頭或存在空格
????...:?df.2020年
??File?"C:\Users\Gdc\AppData\Local\Temp/ipykernel_6832/3948025585.py",?line?2
????df.2020年
??????^
SyntaxError:?invalid?syntax
切片操作
切片里是索引位置,篩選的是對應(yīng)的行 同樣如果我們在切片里是列名組成的列表,則可以篩選出這些列 對于只有一列的情況,切片 []是列名構(gòu)成的列表返回結(jié)果類型分別是DataFrame,反之則是Series
In?[11]:?df[:2]?#?前兩行數(shù)據(jù)
Out[11]:?
????地區(qū)????2020年????2019年????2018年????2017年????2016年
0??北京市??36102.6??35445.1??33106.0??29883.0??27041.2
1??天津市??14083.7??14055.5??13362.9??12450.6??11477.2
In?[12]:?df[6:8]?#?索引6-7?行數(shù)據(jù)(注意這里索引是從0開始的)
Out[12]:?
?????地區(qū)????2020年????2019年????2018年????2017年????2016年
6???吉林省??12311.3??11726.8??11253.8??10922.0??10427.0
7??黑龍江省??13698.5??13544.4??12846.5??12313.0??11895.0
In?[13]:?df[:16:2]?#?前15行?隔2行取
Out[13]:?
????????地區(qū)????2020年????2019年????2018年????2017年????2016年
0??????北京市??36102.6??35445.1??33106.0??29883.0??27041.2
2??????河北省??36206.9??34978.6??32494.6??30640.8??28474.1
4???內(nèi)蒙古自治區(qū)??17359.8??17212.5??16140.8??14898.1??13789.3
..?????...??????...??????...??????...??????...??????...
10?????浙江省??64613.3??62462.0??58002.8??52403.1??47254.0
12?????福建省??43903.9??42326.6??38687.8??33842.4??29609.4
14?????山東省??73129.0??70540.5??66648.9??63012.1??58762.5
[8?rows?x?6?columns]
In?[14]:?df[::-1]?#?倒序
Out[14]:?
??????????地區(qū)????2020年????2019年????2018年????2017年????2016年
31???????臺灣省??????NaN??????NaN??????NaN??????NaN??????NaN
30??新疆維吾爾自治區(qū)??13797.6??13597.1??12809.4??11159.9???9630.8
29???寧夏回族自治區(qū)???3920.5???3748.5???3510.2???3200.3???2781.4
..???????...??????...??????...??????...??????...??????...
2????????河北省??36206.9??34978.6??32494.6??30640.8??28474.1
1????????天津市??14083.7??14055.5??13362.9??12450.6??11477.2
0????????北京市??36102.6??35445.1??33106.0??29883.0??27041.2
[32?rows?x?6?columns]
In?[15]:?#?我們看到剛才在上述切片里是索引位置,篩選的是對應(yīng)的行;同樣如果我們在切片里是列名組成的列表,則可以篩選出這些列
????...:?df[['地區(qū)','2016年']]
Out[15]:?
??????????地區(qū)????2016年
0????????北京市??27041.2
1????????天津市??11477.2
2????????河北省??28474.1
..???????...??????...
29???寧夏回族自治區(qū)???2781.4
30??新疆維吾爾自治區(qū)???9630.8
31???????臺灣省??????NaN
[32?rows?x?2?columns]
In?[16]:?#?對于只有一列的情況,以下兩種形式下返回結(jié)果類型分別是DataFrame和Series
????...:?df[['地區(qū)']]
Out[16]:?
??????????地區(qū)
0????????北京市
1????????天津市
2????????河北省
..???????...
29???寧夏回族自治區(qū)
30??新疆維吾爾自治區(qū)
31???????臺灣省
[32?rows?x?1?columns]
In?[17]:?df['地區(qū)']
Out[17]:?
0??????????北京市
1??????????天津市
2??????????河北省
????????...???
29?????寧夏回族自治區(qū)
30????新疆維吾爾自治區(qū)
31?????????臺灣省
Name:?地區(qū),?Length:?32,?dtype:?object
2.2. 索引選擇.iloc與.loc
按照索引有兩種篩選方式,iloc和loc
df.iloc[行表達式, 列表達式],兩個表達式只支持數(shù)字切片形式:行表達式篩選行、列表達式篩選列df.loc[行表達式, 列表達式],兩個表達式其實是對行列索引名稱的選擇:行表達式篩選行、列表達式篩選列
當然,這兩種篩選方式的表達式也支持條件
iloc[]
大家可以根據(jù)方法名稱來區(qū)分是針對自然索引位置 還是 索引名稱,比如iloc多個i嘛,i就是數(shù)字碼,所以它針對的是自然索引位置
In?[18]:?df.iloc[0]?#?返回是Series,0是自然索引位置
Out[18]:?
地區(qū)???????????北京市
2020年????36102.6
2019年????35445.1
2018年????33106.0
2017年????29883.0
2016年????27041.2
Name:?0,?dtype:?object
In?[19]:?df.iloc[[0]]?#?返回是一行,0是自然索引位置
Out[19]:?
????地區(qū)????2020年????2019年????2018年????2017年????2016年
0??北京市??36102.6??35445.1??33106.0??29883.0??27041.2
In?[20]:?df.iloc[:2]?#?前兩行數(shù)據(jù)
Out[20]:?
????地區(qū)????2020年????2019年????2018年????2017年????2016年
0??北京市??36102.6??35445.1??33106.0??29883.0??27041.2
1??天津市??14083.7??14055.5??13362.9??12450.6??11477.2
In?[21]:?df.iloc[:2,[0,1,3]]?#?前兩行,第0-1-3列數(shù)據(jù)
Out[21]:?
????地區(qū)????2020年????2018年
0??北京市??36102.6??33106.0
1??天津市??14083.7??13362.9
In?[22]:?df.iloc[1,1]?#?自然索引為1,第1列的數(shù)據(jù)(也就是天津2020年的gdp),一般用?.iat
Out[22]:?14083.7
loc[]
區(qū)別于iloc,它根據(jù)索引的名稱來進行篩選,如果沒有設(shè)置索引一般就是自然索引
In?[23]:?df1?=?df.set_index('地區(qū)')?#?我們設(shè)置?地區(qū)字段?列?為索引
In?[24]:?df1
Out[24]:?
????????????2020年????2019年????2018年????2017年????2016年
地區(qū)???????????????????????????????????????????????????
北京市???????36102.6??35445.1??33106.0??29883.0??27041.2
天津市???????14083.7??14055.5??13362.9??12450.6??11477.2
河北省???????36206.9??34978.6??32494.6??30640.8??28474.1
...???????????...??????...??????...??????...??????...
寧夏回族自治區(qū)????3920.5???3748.5???3510.2???3200.3???2781.4
新疆維吾爾自治區(qū)??13797.6??13597.1??12809.4??11159.9???9630.8
臺灣省???????????NaN??????NaN??????NaN??????NaN??????NaN
[32?rows?x?5?columns]
In?[25]:?df1.loc['北京市']?#?選擇?索引名為北京市的數(shù)據(jù)
Out[25]:?
2020年????36102.6
2019年????35445.1
2018年????33106.0
2017年????29883.0
2016年????27041.2
Name:?北京市,?dtype:?float64
In?[26]:?df1.loc['北京市':'河北省','2020年']?#?選擇?索引名稱?在北京市到河北省,列名為?2020年的數(shù)據(jù)
Out[26]:?
地區(qū)
北京市????36102.6
天津市????14083.7
河北省????36206.9
Name:?2020年,?dtype:?float64
In?[27]:?df1.loc['北京市':'河北省','2019年':]?#?選擇?索引名稱?在北京市到河北省,列名在?2019年及之后的數(shù)據(jù)
Out[27]:?
???????2019年????2018年????2017年????2016年
地區(qū)?????????????????????????????????????
北京市??35445.1??33106.0??29883.0??27041.2
天津市??14055.5??13362.9??12450.6??11477.2
河北省??34978.6??32494.6??30640.8??28474.1
In?[28]:?df1.loc[['北京市','上海市','重慶市','天津市'],['2020年','2019年']]?#?選擇索引名為?北京、上海、重慶、天津?2020年及2019年數(shù)據(jù)
Out[28]:?
???????2020年????2019年
地區(qū)???????????????????
北京市??36102.6??35445.1
上海市??38700.6??37987.6
重慶市??25002.8??23605.8
天津市??14083.7??14055.5
In?[29]:?df1.loc['北京市','2020年']?#?選擇?索引名為?北京市,列名為2020年?額數(shù)據(jù)(就是坐標元素值)
Out[29]:?36102.6
2.3. 元素選擇.iat與.at
按坐標其實可以通過上述的按索引進行,這里還可以用.iat和.at來實現(xiàn),和按索引類型一個是自然索引值一個是索引名稱
In?[30]:?df.iat[0,2]
Out[30]:?35445.1
In?[31]:?df1.at['北京市','2019年']
Out[31]:?35445.1
In?[32]:?df.地區(qū).at[3]
Out[32]:?'山西省'
In?[33]:?#?其實還有以下方式
????...:?df1['2019年']['北京市']
Out[33]:?35445.1
In?[34]:?df['2019年'][0]
Out[34]:?35445.1
2.4. ?get與truncate
df.get(key, default=None)類似python字典里的get方法
df.truncate(before=None, after=None, axis=None, copy: 'bool_t' = True),返回區(qū)間數(shù)據(jù)
get()
對于DataFrame數(shù)據(jù)來說返回key列的值,如果key不存在就返回默認值。
Signature:?df.get(key,?default=None)
Docstring:
Get?item?from?object?for?given?key?(ex:?DataFrame?column).
Returns?default?value?if?not?found.
對于Series數(shù)據(jù)來說,返回key索引的值,不存在就返回默認值。
In?[35]:?df.get('地區(qū)','無數(shù)據(jù)')
Out[35]:?
0??????????北京市
1??????????天津市
2??????????河北省
????????...???
29?????寧夏回族自治區(qū)
30????新疆維吾爾自治區(qū)
31?????????臺灣省
Name:?地區(qū),?Length:?32,?dtype:?object
In?[36]:?df.get('2015年','無數(shù)據(jù)')
Out[36]:?'無數(shù)據(jù)'
In?[37]:?df.地區(qū).get(0,'無數(shù)據(jù)')
Out[37]:?'北京市'
In?[38]:?df.地區(qū).get(100,'無數(shù)據(jù)')
Out[38]:?'無數(shù)據(jù)'
truncate()
將索引代入before和after,截取這區(qū)間的數(shù)據(jù),支持對行和列操作
In?[39]:?df.truncate(before=0,after=4)
Out[39]:?
???????地區(qū)????2020年????2019年????2018年????2017年????2016年
0?????北京市??36102.6??35445.1??33106.0??29883.0??27041.2
1?????天津市??14083.7??14055.5??13362.9??12450.6??11477.2
2?????河北省??36206.9??34978.6??32494.6??30640.8??28474.1
3?????山西省??17651.9??16961.6??15958.1??14484.3??11946.4
4??內(nèi)蒙古自治區(qū)??17359.8??17212.5??16140.8??14898.1??13789.3
In?[40]:?df.truncate(before='2018年',after='2020年',axis=1)
Out[40]:?
??????2020年????2019年????2018年
0???36102.6??35445.1??33106.0
1???14083.7??14055.5??13362.9
2???36206.9??34978.6??32494.6
..??????...??????...??????...
29???3920.5???3748.5???3510.2
30??13797.6??13597.1??12809.4
31??????NaN??????NaN??????NaN
[32?rows?x?3?columns]
以上屬于數(shù)據(jù)篩選與查詢的基礎(chǔ)操作,接下來我們介紹進階操作
3. 進階操作

基礎(chǔ)操作部分我們介紹的是比較簡單的數(shù)據(jù)篩選操作,實際的數(shù)據(jù)清洗與處理時我們更多的是需要根據(jù)更加復(fù)雜的組合條件來查詢數(shù)據(jù)進行篩選。這一節(jié),我們就來一一介紹一下。
3.1. 邏輯篩選
邏輯刷選這里是指按照一定的邏輯條件來進行數(shù)據(jù)的篩選,比如滿足某條件的行、列數(shù)據(jù)等等
In?[41]:?df[df['地區(qū)']?==?'北京市']?#?地區(qū)是北京市的數(shù)據(jù)
Out[41]:?
????地區(qū)????2020年????2019年????2018年????2017年????2016年
0??北京市??36102.6??35445.1??33106.0??29883.0??27041.2
In?[42]:?df[df['地區(qū)'].str.contains('市')]?#?地區(qū)名稱?含關(guān)鍵字?市?的數(shù)據(jù)?
Out[42]:?
?????地區(qū)????2020年????2019年????2018年????2017年????2016年
0???北京市??36102.6??35445.1??33106.0??29883.0??27041.2
1???天津市??14083.7??14055.5??13362.9??12450.6??11477.2
8???上海市??38700.6??37987.6??36011.8??32925.0??29887.0
21??重慶市??25002.8??23605.8??21588.8??20066.3??18023.0
In?[43]:?df[df['地區(qū)'].str.contains('市|自治區(qū)')]?#?地區(qū)名稱含關(guān)鍵字?市或自治區(qū)?的數(shù)據(jù)
Out[43]:?
??????????地區(qū)????2020年????2019年????2018年????2017年????2016年
0????????北京市??36102.6??35445.1??33106.0??29883.0??27041.2
1????????天津市??14083.7??14055.5??13362.9??12450.6??11477.2
4?????內(nèi)蒙古自治區(qū)??17359.8??17212.5??16140.8??14898.1??13789.3
..???????...??????...??????...??????...??????...??????...
25?????西藏自治區(qū)???1902.7???1697.8???1548.4???1349.0???1173.0
29???寧夏回族自治區(qū)???3920.5???3748.5???3510.2???3200.3???2781.4
30??新疆維吾爾自治區(qū)??13797.6??13597.1??12809.4??11159.9???9630.8
[9?rows?x?6?columns]
In?[44]:?df[df['地區(qū)'].isin(['北京市','湖北省','江蘇省'])]?#?地區(qū)名稱?在北京市、湖北省、江蘇省的數(shù)據(jù)
Out[44]:?
?????地區(qū)?????2020年????2019年????2018年????2017年????2016年
0???北京市???36102.6??35445.1??33106.0??29883.0??27041.2
9???江蘇省??102719.0??98656.8??93207.6??85869.8??77350.9
16??湖北省???43443.5??45429.0??42022.0??37235.0??33353.0
In?[45]:?df[~df['地區(qū)'].isin(['北京市','湖北省','江蘇省'])]?#?地區(qū)名稱?不在北京市、湖北省、江蘇省的數(shù)據(jù)
Out[45]:?
??????????地區(qū)????2020年????2019年????2018年????2017年????2016年
1????????天津市??14083.7??14055.5??13362.9??12450.6??11477.2
2????????河北省??36206.9??34978.6??32494.6??30640.8??28474.1
3????????山西省??17651.9??16961.6??15958.1??14484.3??11946.4
..???????...??????...??????...??????...??????...??????...
29???寧夏回族自治區(qū)???3920.5???3748.5???3510.2???3200.3???2781.4
30??新疆維吾爾自治區(qū)??13797.6??13597.1??12809.4??11159.9???9630.8
31???????臺灣省??????NaN??????NaN??????NaN??????NaN??????NaN
[29?rows?x?6?columns]
除了上面用切片[]的形式,同樣可以用loc[]的形式
In?[46]:?df.loc[df['地區(qū)'].isin(['北京市','湖北省','江蘇省'])]
Out[46]:?
?????地區(qū)?????2020年????2019年????2018年????2017年????2016年
0???北京市???36102.6??35445.1??33106.0??29883.0??27041.2
9???江蘇省??102719.0??98656.8??93207.6??85869.8??77350.9
16??湖北省???43443.5??45429.0??42022.0??37235.0??33353.0
對于iloc[]來說,則需要是對自然索引值的判斷
In?[47]:?df.iloc[df.index==9]
Out[47]:?
????地區(qū)?????2020年????2019年????2018年????2017年????2016年
9??江蘇省??102719.0??98656.8??93207.6??85869.8??77350.9
我們還可以進行更復(fù)雜的邏輯判斷去篩選想要的數(shù)據(jù),在進行 或(|) 且(&) 非(~) 邏輯判斷的時候,每個獨立的邏輯判斷需要用括號括起來
In?[48]:?df[df['2020年']'2019年']]?#?2020年GDP小于2019年GDP的省份
Out[48]:?
?????地區(qū)????2020年????2019年????2018年????2017年????2016年
16??湖北省??43443.5??45429.0??42022.0??37235.0??33353.0
In?[49]:?df[(df['2020年']>30000)?&
????...:????(df['2019年']>30000)
????...:???]?#?最近連續(xù)2年GDP超過3萬億的地區(qū)
Out[49]:?
?????地區(qū)?????2020年?????2019年????2018年????2017年????2016年
0???北京市???36102.6???35445.1??33106.0??29883.0??27041.2
2???河北省???36206.9???34978.6??32494.6??30640.8??28474.1
8???上海市???38700.6???37987.6??36011.8??32925.0??29887.0
..??...???????...???????...??????...??????...??????...
17??湖南省???41781.5???39894.1??36329.7??33828.1??30853.5
18??廣東省??110760.9??107986.9??99945.2??91648.7??82163.2
22??四川省???48598.8???46363.8??42902.1??37905.1??33138.5
[13?rows?x?6?columns]
我們還可以通過any和all對邏輯判斷后結(jié)果進行再次判斷,對于all來說需要都滿足才行,對于any來說只需要滿足一個即可,需要注意的是默認是0列方向,1是行方向
In?[50]:?df[(df[['2020年','2019年']]>30000).all(1)]?#?最近連續(xù)2年GDP超過3萬億的地區(qū)
Out[50]:?
?????地區(qū)?????2020年?????2019年????2018年????2017年????2016年
0???北京市???36102.6???35445.1??33106.0??29883.0??27041.2
2???河北省???36206.9???34978.6??32494.6??30640.8??28474.1
8???上海市???38700.6???37987.6??36011.8??32925.0??29887.0
..??...???????...???????...??????...??????...??????...
17??湖南省???41781.5???39894.1??36329.7??33828.1??30853.5
18??廣東省??110760.9??107986.9??99945.2??91648.7??82163.2
22??四川省???48598.8???46363.8??42902.1??37905.1??33138.5
[13?rows?x?6?columns]
In?[51]:?df[(df[['2020年','2019年']]>100000).all(1)]?#?最近2年有1年GDP超過10萬億
Out[51]:?
?????地區(qū)?????2020年?????2019年????2018年????2017年????2016年
18??廣東省??110760.9??107986.9??99945.2??91648.7??82163.2
3.2. 函數(shù)篩選
函數(shù)篩選是指 我們在不管是切片還是索引選擇方式中,表達式還可以是lambda函數(shù);此外,pandas也提供了一些比較函數(shù)可以用來進行數(shù)據(jù)篩選。
自定義lambda函數(shù)
df.loc[lambda?x?:?x['2020年']>50000,?['地區(qū)','2020年','2019年']]?#?篩選2020年GDP超過5萬億且只選?地區(qū)、2020年和2019年數(shù)據(jù)
Out[53]:?
?????地區(qū)?????2020年?????2019年
9???江蘇省??102719.0???98656.8
10??浙江省???64613.3???62462.0
14??山東省???73129.0???70540.5
15??河南省???54997.1???53717.8
18??廣東省??110760.9??107986.9
In?[54]:?import?re
????
In?[55]:?df.loc[:,?lambda?x?:?[i?for?i?in?df.columns[1:]?if?int(re.findall('\d+',i)[0])<2020]]?#?篩選列名滿足條件的列
Out[55]:?
??????2019年????2018年????2017年????2016年
0???35445.1??33106.0??29883.0??27041.2
1???14055.5??13362.9??12450.6??11477.2
2???34978.6??32494.6??30640.8??28474.1
..??????...??????...??????...??????...
29???3748.5???3510.2???3200.3???2781.4
30??13597.1??12809.4??11159.9???9630.8
31??????NaN??????NaN??????NaN??????NaN
[32?rows?x?4?columns]
比較函數(shù)
panda有一些比較函數(shù),我們可以將邏輯表達式替換為比較函數(shù)形式
In?[56]:?df[df['地區(qū)'].eq('北京市')]?#?等于
Out[56]:?
????地區(qū)????2020年????2019年????2018年????2017年????2016年
0??北京市??36102.6??35445.1??33106.0??29883.0??27041.2
In?[57]:?df[df['地區(qū)'].ne('北京市')]?#?不等于
Out[57]:?
??????????地區(qū)????2020年????2019年????2018年????2017年????2016年
1????????天津市??14083.7??14055.5??13362.9??12450.6??11477.2
2????????河北省??36206.9??34978.6??32494.6??30640.8??28474.1
3????????山西省??17651.9??16961.6??15958.1??14484.3??11946.4
..???????...??????...??????...??????...??????...??????...
29???寧夏回族自治區(qū)???3920.5???3748.5???3510.2???3200.3???2781.4
30??新疆維吾爾自治區(qū)??13797.6??13597.1??12809.4??11159.9???9630.8
31???????臺灣省??????NaN??????NaN??????NaN??????NaN??????NaN
[31?rows?x?6?columns]
In?[58]:?df[df['2020年'].lt(10000)]?#?小于
Out[58]:?
?????????地區(qū)???2020年???2019年???2018年???2017年???2016年
20??????海南省??5532.4??5330.8??4910.7??4497.5??4090.2
25????西藏自治區(qū)??1902.7??1697.8??1548.4??1349.0??1173.0
27??????甘肅省??9016.7??8718.3??8104.1??7336.7??6907.9
28??????青海省??3005.9??2941.1??2748.0??2465.1??2258.2
29??寧夏回族自治區(qū)??3920.5??3748.5??3510.2??3200.3??2781.4
In?[59]:?df[df['2020年'].le(5532.4)]?#?小于等于
Out[59]:?
?????????地區(qū)???2020年???2019年???2018年???2017年???2016年
20??????海南省??5532.4??5330.8??4910.7??4497.5??4090.2
25????西藏自治區(qū)??1902.7??1697.8??1548.4??1349.0??1173.0
28??????青海省??3005.9??2941.1??2748.0??2465.1??2258.2
29??寧夏回族自治區(qū)??3920.5??3748.5??3510.2??3200.3??2781.4
In?[60]:?df[df['2020年'].gt(50000)]?#?大于
Out[60]:?
?????地區(qū)?????2020年?????2019年????2018年????2017年????2016年
9???江蘇省??102719.0???98656.8??93207.6??85869.8??77350.9
10??浙江省???64613.3???62462.0??58002.8??52403.1??47254.0
14??山東省???73129.0???70540.5??66648.9??63012.1??58762.5
15??河南省???54997.1???53717.8??49935.9??44824.9??40249.3
18??廣東省??110760.9??107986.9??99945.2??91648.7??82163.2
In?[61]:?df[df['2020年'].ge(62462.0)]?#?大于等于
Out[61]:?
?????地區(qū)?????2020年?????2019年????2018年????2017年????2016年
9???江蘇省??102719.0???98656.8??93207.6??85869.8??77350.9
10??浙江省???64613.3???62462.0??58002.8??52403.1??47254.0
14??山東省???73129.0???70540.5??66648.9??63012.1??58762.5
18??廣東省??110760.9??107986.9??99945.2??91648.7??82163.2
對于isin(),還可以傳入字典,key為列名,value為待匹配的值(這個大家可以構(gòu)建數(shù)據(jù)試試)
3.3. query
Signature:?df.query(expr:?'str',?inplace:?'bool'?=?False,?**kwargs)
Docstring:
Query?the?columns?of?a?DataFrame?with?a?boolean?expression.
query()的很高校的查詢方法,其表達式是一個字符串,我們在《再推薦幾個好用的pandas函數(shù),繼續(xù)加快你數(shù)據(jù)處理的速度》介紹過,大家可前往了解,這里稍微介紹下
在引號中,如果列名是數(shù)字開頭或者含有空格,則需要用`反引號標識 其他情況下的列名直接寫即可,用于篩選對比的對象如果是字符串則需要用引號 我們還可以通過 @來引入變量
In?[62]:?df.query('地區(qū)=="北京市"')?#?地區(qū)為北京市的數(shù)據(jù)
Out[62]:?
????地區(qū)????2020年????2019年????2018年????2017年????2016年
0??北京市??36102.6??35445.1??33106.0??29883.0??27041.2
In?[63]:?df.query('`2020年`<`2019年`')?#?2020年GDP小于2019年GDP的數(shù)據(jù)
Out[63]:?
?????地區(qū)????2020年????2019年????2018年????2017年????2016年
16??湖北省??43443.5??45429.0??42022.0??37235.0??33353.0
In?[64]:?mean_gdp?=?df['2020年'].mean()
????????
In?[64]:?mean_gdp
Out[65]:?32658.55161290323
In?[66]:?df.query('`2020年`?>?@mean_gdp')?#?@?引入變量
Out[66]:?
?????地區(qū)?????2020年?????2019年????2018年????2017年????2016年
0???北京市???36102.6???35445.1??33106.0??29883.0??27041.2
2???河北省???36206.9???34978.6??32494.6??30640.8??28474.1
8???上海市???38700.6???37987.6??36011.8??32925.0??29887.0
..??...???????...???????...??????...??????...??????...
17??湖南省???41781.5???39894.1??36329.7??33828.1??30853.5
18??廣東省??110760.9??107986.9??99945.2??91648.7??82163.2
22??四川省???48598.8???46363.8??42902.1??37905.1??33138.5
[13?rows?x?6?columns]
3.4. filter
Signature:
df.filter(
????items=None,
????like:?'str?|?None'?=?None,
????regex:?'str?|?None'?=?None,
????axis=None,
)?->?'FrameOrSeries'
Docstring:
Subset?the?dataframe?rows?or?columns?according?to?the?specified?index?labels.
Note?that?this?routine?does?not?filter?a?dataframe?on?its
contents.?The?filter?is?applied?to?the?labels?of?the?index.
df.filter()可以對行和列名進行篩選,支持模糊匹配和正則表達式
In?[67]:?df.filter(items=['2020年','2016年'])?#?選擇兩列
Out[67]:?
??????2020年????2016年
0???36102.6??27041.2
1???14083.7??11477.2
2???36206.9??28474.1
..??????...??????...
29???3920.5???2781.4
30??13797.6???9630.8
31??????NaN??????NaN
[32?rows?x?2?columns]
In?[68]:?df.filter(regex='年')?#?列名稱含?年?的列
Out[68]:?
??????2020年????2019年????2018年????2017年????2016年
0???36102.6??35445.1??33106.0??29883.0??27041.2
1???14083.7??14055.5??13362.9??12450.6??11477.2
2???36206.9??34978.6??32494.6??30640.8??28474.1
..??????...??????...??????...??????...??????...
29???3920.5???3748.5???3510.2???3200.3???2781.4
30??13797.6??13597.1??12809.4??11159.9???9630.8
31??????NaN??????NaN??????NaN??????NaN??????NaN
[32?rows?x?5?columns]
In?[69]:?df1.filter(regex='市',?axis=0)?#?索引名含?市?的數(shù)據(jù)
Out[69]:?
???????2020年????2019年????2018年????2017年????2016年
地區(qū)??????????????????????????????????????????????
北京市??36102.6??35445.1??33106.0??29883.0??27041.2
天津市??14083.7??14055.5??13362.9??12450.6??11477.2
上海市??38700.6??37987.6??36011.8??32925.0??29887.0
重慶市??25002.8??23605.8??21588.8??20066.3??18023.0
In?[70]:?df1.filter(regex='^江',?axis=0)?#?索引名中以江開頭的
Out[70]:?
????????2020年????2019年????2018年????2017年????2016年
地區(qū)???????????????????????????????????????????????
江蘇省??102719.0??98656.8??93207.6??85869.8??77350.9
江西省???25691.5??24667.3??22716.5??20210.8??18388.6
In?[71]:?df1.filter(regex='自治區(qū)$',?axis=0)?#?索引名中以自治區(qū)結(jié)尾的
Out[71]:?
????????????2020年????2019年????2018年????2017年????2016年
地區(qū)???????????????????????????????????????????????????
內(nèi)蒙古自治區(qū)????17359.8??17212.5??16140.8??14898.1??13789.3
廣西壯族自治區(qū)???22156.7??21237.1??19627.8??17790.7??16116.6
西藏自治區(qū)??????1902.7???1697.8???1548.4???1349.0???1173.0
寧夏回族自治區(qū)????3920.5???3748.5???3510.2???3200.3???2781.4
新疆維吾爾自治區(qū)??13797.6??13597.1??12809.4??11159.9???9630.8
In?[72]:?df1.filter(like='北',axis=0)?#?索引名中有?北?的
Out[72]:?
???????2020年????2019年????2018年????2017年????2016年
地區(qū)??????????????????????????????????????????????
北京市??36102.6??35445.1??33106.0??29883.0??27041.2
河北省??36206.9??34978.6??32494.6??30640.8??28474.1
湖北省??43443.5??45429.0??42022.0??37235.0??33353.0
以上就是本次全部內(nèi)容,希望對你有所幫助,如果你喜歡的話還希望能給個三連呀!歡迎在留言區(qū)吱一聲哦,說說你的想法哦。我們月底會給經(jīng)常來留言打卡的同學(xué)送書10本,記得常來指導(dǎo)工作哦!
推薦閱讀:
入門:?最全的零基礎(chǔ)學(xué)Python的問題? |?零基礎(chǔ)學(xué)了8個月的Python??|?實戰(zhàn)項目?|學(xué)Python就是這條捷徑
量化:?定投基金到底能賺多少錢?? |?我用Python對去年800只基金的數(shù)據(jù)分析??
干貨:爬取豆瓣短評,電影《后來的我們》?|?38年NBA最佳球員分析?|? ?從萬眾期待到口碑撲街!唐探3令人失望? |?笑看新倚天屠龍記?|?燈謎答題王?|用Python做個海量小姐姐素描圖?|碟中諜這么火,我用機器學(xué)習(xí)做個迷你推薦系統(tǒng)電影
趣味:彈球游戲? |?九宮格? |?漂亮的花?|?兩百行Python《天天酷跑》游戲!
AI:?會做詩的機器人?|?給圖片上色?|?預(yù)測收入?|?碟中諜這么火,我用機器學(xué)習(xí)做個迷你推薦系統(tǒng)電影
小工具:?Pdf轉(zhuǎn)Word,輕松搞定表格和水印!?|?一鍵把html網(wǎng)頁保存為pdf!|??再見PDF提取收費!?|?用90行代碼打造最強PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換?|?制作一款釘釘?shù)蛢r機票提示器!?|60行代碼做了一個語音壁紙切換器天天看小姐姐!|

