大家好,我是才哥。
今天聊聊Pandas数据筛选与查询的一些操作,在数据分析的过程中通常要对数据进行清洗与处理,而其中比较重要和常见的操作就有对数据进行筛选与查询。
目录:
本次案例,我们继续采用之前用到过的各地区GDP数据,数据信息大致如下,后台回复GDP
可以获取哈。
In [1]: import pandas as pd
In [2]: df = pd.read_excel(r'各地区生产总值.xlsx')
In [3]: df.head()
Out[3]:
地区 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 内蒙古自治区 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 地区 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
我们看看描述统计情况,然后在后续做筛选查询的时候好演示
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
可以看到,有效数据有30多条,为了让数据显示好一点,我们可以设置最多显示6行
In [6]: pd.set_option('display.max_rows', 6) #最多显示6行
In [7]: df
Out[7]:
地区 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 6 columns]
接下来,我们开始演示数据的筛选与查询吧
一般来说,数据筛选有选择行、列或者指定位置的值等
切片这玩意就和python的列表数据的切片操作很相似
选择某一列
注意:如果列名为 2020年或者2020 年,则无法采用属性形式,因为这种操作的变量名不能以数字开头或存在空格
df['地区'] # 切片形式
Out[8]:
0 北京市
1 天津市
2 河北省
29 宁夏回族自治区
30 新疆维吾尔自治区
31 台湾省
Name: 地区, Length: 32, dtype: object
In [9]: df.地区 # 属性形式
Out[9]:
0 北京市
1 天津市
2 河北省
...
29 宁夏回族自治区
30 新疆维吾尔自治区
31 台湾省
Name: 地区, Length: 32, dtype: object
In [10]: # 如果列名为 2020年或者2020 年,则无法采用属性形式,因为这种操作的变量名不能以数字开头或存在空格
...: df.2020年
File "C:\Users\Gdc\AppData\Local\Temp/ipykernel_6832/3948025585.py", line 2
df.2020年
^
SyntaxError: invalid syntax
切片操作
[]
是列名构成的列表返回结果类型分别是DataFrame
,反之则是Series
In [11]: df[:2] # 前两行数据
Out[11]:
地区 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 行数据(注意这里索引是从0开始的)
Out[12]:
地区 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]:
地区 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 内蒙古自治区 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]:
地区 2020年 2019年 2018年 2017年 2016年
31 台湾省 NaN NaN NaN NaN NaN
30 新疆维吾尔自治区 13797.6 13597.1 12809.4 11159.9 9630.8
29 宁夏回族自治区 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]: # 我们看到刚才在上述切片里是索引位置,筛选的是对应的行;同样如果我们在切片里是列名组成的列表,则可以筛选出这些列
...: df[['地区','2016年']]
Out[15]:
地区 2016年
0 北京市 27041.2
1 天津市 11477.2
2 河北省 28474.1
.. ... ...
29 宁夏回族自治区 2781.4
30 新疆维吾尔自治区 9630.8
31 台湾省 NaN
[32 rows x 2 columns]
In [16]: # 对于只有一列的情况,以下两种形式下返回结果类型分别是DataFrame和Series
...: df[['地区']]
Out[16]:
地区
0 北京市
1 天津市
2 河北省
.. ...
29 宁夏回族自治区
30 新疆维吾尔自治区
31 台湾省
[32 rows x 1 columns]
In [17]: df['地区']
Out[17]:
0 北京市
1 天津市
2 河北省
...
29 宁夏回族自治区
30 新疆维吾尔自治区
31 台湾省
Name: 地区, Length: 32, dtype: object
按照索引有两种筛选方式,iloc
和loc
df.iloc
[行表达式, 列表达式],两个表达式只支持数字切片形式:行表达式筛选行、列表达式筛选列df.loc
[行表达式, 列表达式],两个表达式其实是对行列索引名称的选择:行表达式筛选行、列表达式筛选列当然,这两种筛选方式的表达式也支持条件
iloc[]
大家可以根据方法名称来区分是针对自然索引位置 还是 索引名称,比如iloc
多个i
嘛,i就是数字码,所以它针对的是自然索引位置
In [18]: df.iloc[0] # 返回是Series,0是自然索引位置
Out[18]:
地区 北京市
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]:
地区 2020年 2019年 2018年 2017年 2016年
0 北京市 36102.6 35445.1 33106.0 29883.0 27041.2
In [20]: df.iloc[:2] # 前两行数据
Out[20]:
地区 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列数据
Out[21]:
地区 2020年 2018年
0 北京市 36102.6 33106.0
1 天津市 14083.7 13362.9
In [22]: df.iloc[1,1] # 自然索引为1,第1列的数据(也就是天津2020年的gdp),一般用 .iat
Out[22]: 14083.7
loc[]
区别于iloc
,它根据索引的名称来进行筛选,如果没有设置索引一般就是自然索引
In [23]: df1 = df.set_index('地区') # 我们设置 地区字段 列 为索引
In [24]: df1
Out[24]:
2020年 2019年 2018年 2017年 2016年
地区
北京市 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
... ... ... ... ... ...
宁夏回族自治区 3920.5 3748.5 3510.2 3200.3 2781.4
新疆维吾尔自治区 13797.6 13597.1 12809.4 11159.9 9630.8
台湾省 NaN NaN NaN NaN NaN
[32 rows x 5 columns]
In [25]: df1.loc['北京市'] # 选择 索引名为北京市的数据
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年的数据
Out[26]:
地区
北京市 36102.6
天津市 14083.7
河北省 36206.9
Name: 2020年, dtype: float64
In [27]: df1.loc['北京市':'河北省','2019年':] # 选择 索引名称 在北京市到河北省,列名在 2019年及之后的数据
Out[27]:
2019年 2018年 2017年 2016年
地区
北京市 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年数据
Out[28]:
2020年 2019年
地区
北京市 36102.6 35445.1
上海市 38700.6 37987.6
重庆市 25002.8 23605.8
天津市 14083.7 14055.5
In [29]: df1.loc['北京市','2020年'] # 选择 索引名为 北京市,列名为2020年 额数据(就是坐标元素值)
Out[29]: 36102.6
按坐标其实可以通过上述的按索引进行,这里还可以用.iat
和.at
来实现,和按索引类型一个是自然索引值一个是索引名称
In [30]: df.iat[0,2]
Out[30]: 35445.1
In [31]: df1.at['北京市','2019年']
Out[31]: 35445.1
In [32]: df.地区.at[3]
Out[32]: '山西省'
In [33]: # 其实还有以下方式
...: df1['2019年']['北京市']
Out[33]: 35445.1
In [34]: df['2019年'][0]
Out[34]: 35445.1
df.get(key, default=None)
类似python
字典里的get
方法
df.truncate(before=None, after=None, axis=None, copy: 'bool_t' = True)
,返回区间数据
get()
对于DataFrame
数据来说返回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数据来说,返回key索引的值,不存在就返回默认值。
In [35]: df.get('地区','无数据')
Out[35]:
0 北京市
1 天津市
2 河北省
...
29 宁夏回族自治区
30 新疆维吾尔自治区
31 台湾省
Name: 地区, Length: 32, dtype: object
In [36]: df.get('2015年','无数据')
Out[36]: '无数据'
In [37]: df.地区.get(0,'无数据')
Out[37]: '北京市'
In [38]: df.地区.get(100,'无数据')
Out[38]: '无数据'
truncate()
将索引代入before
和after
,截取这区间的数据,支持对行和列操作
In [39]: df.truncate(before=0,after=4)
Out[39]:
地区 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 内蒙古自治区 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]
以上属于数据筛选与查询的基础操作,接下来我们介绍进阶操作
基础操作部分我们介绍的是比较简单的数据筛选操作,实际的数据清洗与处理时我们更多的是需要根据更加复杂的组合条件来查询数据进行筛选。这一节,我们就来一一介绍一下。
逻辑刷选这里是指按照一定的逻辑条件来进行数据的筛选,比如满足某条件的行、列数据等等
In [41]: df[df['地区'] == '北京市'] # 地区是北京市的数据
Out[41]:
地区 2020年 2019年 2018年 2017年 2016年
0 北京市 36102.6 35445.1 33106.0 29883.0 27041.2
In [42]: df[df['地区'].str.contains('市')] # 地区名称 含关键字 市 的数据
Out[42]:
地区 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['地区'].str.contains('市|自治区')] # 地区名称含关键字 市或自治区 的数据
Out[43]:
地区 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 内蒙古自治区 17359.8 17212.5 16140.8 14898.1 13789.3
.. ... ... ... ... ... ...
25 西藏自治区 1902.7 1697.8 1548.4 1349.0 1173.0
29 宁夏回族自治区 3920.5 3748.5 3510.2 3200.3 2781.4
30 新疆维吾尔自治区 13797.6 13597.1 12809.4 11159.9 9630.8
[9 rows x 6 columns]
In [44]: df[df['地区'].isin(['北京市','湖北省','江苏省'])] # 地区名称 在北京市、湖北省、江苏省的数据
Out[44]:
地区 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['地区'].isin(['北京市','湖北省','江苏省'])] # 地区名称 不在北京市、湖北省、江苏省的数据
Out[45]:
地区 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 宁夏回族自治区 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
[29 rows x 6 columns]
除了上面用切片[]
的形式,同样可以用loc[]
的形式
In [46]: df.loc[df['地区'].isin(['北京市','湖北省','江苏省'])]
Out[46]:
地区 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]:
地区 2020年 2019年 2018年 2017年 2016年
9 江苏省 102719.0 98656.8 93207.6 85869.8 77350.9
我们还可以进行更复杂的逻辑判断去筛选想要的数据,在进行 或(|
) 且(&
) 非(~
) 逻辑判断的时候,每个独立的逻辑判断需要用括号括起来
In [48]: df[df['2020年']<df['2019年']] # 2020年GDP小于2019年GDP的省份
Out[48]:
地区 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)
...: ] # 最近连续2年GDP超过3万亿的地区
Out[49]:
地区 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
对逻辑判断后结果进行再次判断,对于all来说需要都满足才行,对于any来说只需要满足一个即可,需要注意的是默认是0列方向,1是行方向
In [50]: df[(df[['2020年','2019年']]>30000).all(1)] # 最近连续2年GDP超过3万亿的地区
Out[50]:
地区 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]:
地区 2020年 2019年 2018年 2017年 2016年
18 广东省 110760.9 107986.9 99945.2 91648.7 82163.2
函数筛选是指 我们在不管是切片还是索引选择方式中,表达式还可以是lambda
函数;此外,pandas
也提供了一些比较函数可以用来进行数据筛选。
自定义lambda函数
df.loc[lambda x : x['2020年']>50000, ['地区','2020年','2019年']] # 筛选2020年GDP超过5万亿且只选 地区、2020年和2019年数据
Out[53]:
地区 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]
比较函数
panda
有一些比较函数,我们可以将逻辑表达式替换为比较函数形式
In [56]: df[df['地区'].eq('北京市')] # 等于
Out[56]:
地区 2020年 2019年 2018年 2017年 2016年
0 北京市 36102.6 35445.1 33106.0 29883.0 27041.2
In [57]: df[df['地区'].ne('北京市')] # 不等于
Out[57]:
地区 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 宁夏回族自治区 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
[31 rows x 6 columns]
In [58]: df[df['2020年'].lt(10000)] # 小于
Out[58]:
地区 2020年 2019年 2018年 2017年 2016年
20 海南省 5532.4 5330.8 4910.7 4497.5 4090.2
25 西藏自治区 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 宁夏回族自治区 3920.5 3748.5 3510.2 3200.3 2781.4
In [59]: df[df['2020年'].le(5532.4)] # 小于等于
Out[59]:
地区 2020年 2019年 2018年 2017年 2016年
20 海南省 5532.4 5330.8 4910.7 4497.5 4090.2
25 西藏自治区 1902.7 1697.8 1548.4 1349.0 1173.0
28 青海省 3005.9 2941.1 2748.0 2465.1 2258.2
29 宁夏回族自治区 3920.5 3748.5 3510.2 3200.3 2781.4
In [60]: df[df['2020年'].gt(50000)] # 大于
Out[60]:
地区 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]:
地区 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
为待匹配的值(这个大家可以构建数据试试)
Signature: df.query(expr: 'str', inplace: 'bool' = False, **kwargs)
Docstring:
Query the columns of a DataFrame with a boolean expression.
query()
的很高校的查询方法,其表达式是一个字符串,我们在《》介绍过,大家可前往了解,这里稍微介绍下
@
来引入变量In [62]: df.query('地区=="北京市"') # 地区为北京市的数据
Out[62]:
地区 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的数据
Out[63]:
地区 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]:
地区 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]
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) # 索引名含 市 的数据
Out[69]:
2020年 2019年 2018年 2017年 2016年
地区
北京市 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年
地区
江苏省 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='自治区$', axis=0) # 索引名中以自治区结尾的
Out[71]:
2020年 2019年 2018年 2017年 2016年
地区
内蒙古自治区 17359.8 17212.5 16140.8 14898.1 13789.3
广西壮族自治区 22156.7 21237.1 19627.8 17790.7 16116.6
西藏自治区 1902.7 1697.8 1548.4 1349.0 1173.0
宁夏回族自治区 3920.5 3748.5 3510.2 3200.3 2781.4
新疆维吾尔自治区 13797.6 13597.1 12809.4 11159.9 9630.8
In [72]: df1.filter(like='北',axis=0) # 索引名中有 北 的
Out[72]:
2020年 2019年 2018年 2017年 2016年
地区
北京市 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
以上就是本次全部内容,希望对你有所帮助,如果你喜欢的话还希望能给个在看、点个赞呀!
加油~