DataFrame筛选出指定列值的行
需求
对于一个DataFrame,常常需要筛选出某列为指定值的行。
pandas中获取数据的有以下几种方法:
假设df数据如下:
import pandas as pd
import numpy as np
df = pd.DataFrame({'code': '000001.SZ 000002.SZ 000006.SZ 000009.SZ'.split(),
'open': '1.2 20 3.5 2.8'.split(),
'close': np.arange(4),
'high': np.arange(4) * 2})
数据如下:
>>> df
code open close high
0 000001.SZ 1.2 0 0
1 000002.SZ 20 1 2
2 000006.SZ 3.5 2 4
3 000009.SZ 2.8 3 6
问题如下:
- 找出code为指定值的行
- 找出open>3的行
- 找出
布尔索引
找出符合条件的所有行,即条件判断bool值为true,如找出code为000002.SZ的行:
df[df['code'] == '000002.SZ'] # 判断等式是否成立
这会列出所有使得条件 df[‘code’] == ‘000002.SZ’ 为true的所有行,输出如下:
>>> df[df['code'] == '000002.SZ']
code open close high
1 000002.SZ 20 1 2
位置索引
使用iloc方法,根据索引的位置来查找数据的。这个例子需要先找出符合条件的行所在位置。
mask = df['code'] == '000002.SZ'
pos = np.flatnonzero(mask)
df.iloc[pos]
# 直接根据索引取值
df.iloc[1:2]
输出与之前相同。
标签索引
适用于DataFrame的行列都是有标签的情形。
如:
# 把要操作的列作为索引
df.index=df['code'] # 将code列作为DataFrame的行索引
df.loc['000002.SZ', :] # 注意,这种根据索引iloc得到的结果不是DataFrame类型,而是Series
# 使用布尔
df.loc[df['code']=='000002.SZ']
结果如下:
>>> df.loc['000002.SZ', :]
code 000002.SZ
open 20
close 1
high 2
Name: 000002.SZ, dtype: object
>>>
>>> df.loc[df['code']=='000002.SZ']
code open close high
code
000002.SZ 000002.SZ 20 1 2
使用API
适用于数据量比较大的情形,方法为:pd.DataFrame.query。
如:
df.query('code=="000002.SZ"')
# 多条件
df.query('code=="000002.SZ" | code=="000006.SZ"')
结果如下:
>>> df.query('code=="000002.SZ"')
code open close high
code
000002.SZ 000002.SZ 20 1 2
>>>
>>> # 多条件
>>> df.query('code=="000002.SZ" | code=="000006.SZ"')
code open close high
code
000002.SZ 000002.SZ 20 1 2
000006.SZ 000006.SZ 3.5 2 4
小结
除了上面判断相等的情况,也可以结合条件判断一起使用。
- 筛选出列值属于某个范围内的行,用isin:
df.loc[df['column_name'].isin(some_values)] # some_values是可迭代对象
- 多种条件限制时使用&,&的优先级高于>=或<=,所以要注意括号的使用:
df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)]
- 筛选出列值不等于某个/些值的行:
df.loc[df['column_name'] != 'some_value']
df.loc[~df['column_name'].isin('some_values')] #~取反
df功能强大,且用且总结。
参考
https://www.cnblogs.com/small-bud/p/12380357.html
来源:guotianqing