DataFrame筛选出指定列值的行

需求

对于一个DataFrame,常常需要筛选出某列为指定值的行。

pandas中获取数据的有以下几种方法:

  • 布尔索引
  • 位置索引
  • 标签索引
  • 使用API

假设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

问题如下:

  1. 找出code为指定值的行
  2. 找出open>3的行
  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
小结

除了上面判断相等的情况,也可以结合条件判断一起使用。

  1. 筛选出列值属于某个范围内的行,用isin:df.loc[df['column_name'].isin(some_values)] # some_values是可迭代对象
  2. 多种条件限制时使用&,&的优先级高于>=或<=,所以要注意括号的使用: df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)]
  3. 筛选出列值不等于某个/些值的行:
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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值