本文主要介绍如何使用 Pandas 对值进行筛选 1。
Updated: 2022 / 6 / 21
Python | Pandas | 筛选- 表达式
- 其他函数
- isin
- 1.
- 2.
- isna/notna
- 1.
- 2.
- query
- 运算符
- 表达式
- 空值
- isnull / notnull
- == / !=
- 参考链接
表达式 其他函数 isin
参考此处 2
1.- 应用场景:
一个list中存了很多个值,需要提取出在这个列表中出现的值在目标 Dataframe 中的所有行 - 方法:
X = data[data['X'].isin(['A', 'B', 'C', 'D'])] # Unamed:22 Unamed:23 # 561 NaN NaN NaN # ... ... ... ... # 1071 7.7 70805 NaN # 1072 8.0 80851 NaN # # type(X) ## # X.dtype # AttributeError: 'DataFrame' object has no attribute 'dtype'
X = data.loc[data['X'].isin(['A', 'B', 'C', 'D'])]
2.
- 应用场景:
一个list中存了很多个值,需要判断在这个列表中出现的值是否在目标 Dataframe 中的所有行 - 方法:
X = data['X'].isin(['A', 'B', 'C', 'D']) # 0 True # 1 False # ... # 1076 True # 1077 False # # type(X) ## # X.dtype # bool
isna/notna
参考此处 3
1.
- 应用场景:
选择列值为null/None/nan的行 - 方法:
X = df[df[2].isna()] # 0 NaN # 1 NaN # ... ... # 105 NaN # 106 NaN # # type(X) ## # X[2].dtype # object
2.
- 应用场景:
选择列值不为null/None/nan的行 - 方法:
df[df[2].notna()] # 1869 ABCD # 10712 EFGH # ... ... # 10723 IJK # 10766 LMN # # type(X) ## # X[2].dtype # object
query
关于更多内容,可查看 df.query 数据查询的方法详细介绍 4
运算符
df.query('Q1 > Q2 > 90') # 直接写类型 sql where 语句
df.query('Q1 + Q2 > 180')
df.query('Q1 == Q2')
df.query('(Q1<50) & (Q2>40) and (Q3>90)')
df.query('Q1 > Q2 > Q3 > Q4')
表达式
df.query('team != "C"')
df.query('team in ["A","B"]')
df.query('team not in ("E","A","B")')
df.query('team == ["A","B"]')
df.query('team != ["A","B"]')
df.query('name.str.contains("am")') # 包含 am 字符
空值
engine = 'python' 的作用 5 是以 python 方式解读表达式,而不是以 pandas 。
对于是否添加 enginer = 'python' 取决于所筛选列的值的数据类型 6:
- 如果是 floats, 它具备原生 NaN, 则可以不添加;
- 如果是 str 或者 int,则需添加。
df.query('col1.isnull()', engine='python')
# col1
# 21 NaN
# 42 NaN
# ...
# 60 NaN
df.query('col1.notnull()', engine='python')
# col1
# 31 ABCD
# 32 EFGH
# ...
# 65 HIJK
isna() 和 notna() 同理,用法相似。
== / !=
在 pandas 和 numpy 中,NaN 不等于 NaN。
所以如果想检验一个单元格是否有 NaN 值,可以通过以下方式 6:
- cell_value != cell_value
该表达式只对 NaN 值成立
( 3 !=3 是 False 的 但是 NaN != NaN 是 True 的),所以 query 只会返回 NaNs。 - cell_value == cell_value
该表达式只对非 NaNs 值成立
( 3 == 3 是 True 的 但是 NaN == NaN 是 False 的), 所以 query 只会返回非 NaNs。
df.query('col1 == col')
# col1
# 31 ABCD
# 32 EFGH
# ...
# 65 HIJK
df.query('col1 != col1')
# col1
# 21 NaN
# 42 NaN
# ...
# 60 NaN
# 对于名称中带有空格的列,可以使用反引号引起来
df.query('B == `team name`')
# 支持传入变量,如:大于平均分40分的
a = df.Q1.mean()
df.query('Q1 > @a+40')
df.query('Q1 > `Q2`+@a')
# df.eval() 用法与 df.query 类似
df[df.eval("Q1 > 90 > Q3 > 10")]
df[df.eval("Q1 > `Q2`+@a")]
参考链接
pandas 查询筛选数据 ↩︎
pandas通过list筛选行 ↩︎
【pandas】dataframe根据某列是否是null筛选数据 ↩︎
pandas query() 表达式查询 ↩︎
pandas.eval ↩︎
Querying for NaN and other names in Pandas ↩︎ ↩︎



