如何在不指定列的情况下筛选Pandas中任意列满足条件的行?
问题描述
我使用Pandas 1.5.2版本创建了如下DataFrame:
import pandas as pd print(pd.__version__) # 1.5.2 x = [1, 2, 3] y = [4, 5, 6] z = [7, 8, 9] df = pd.DataFrame({ "a": x, "b": y, "c": z })
我知道可以针对指定列设置条件筛选该行满足条件的所有行,例如:
df.loc[df.a > 1] # 或者 df.loc[df["a"] > 1]
这段代码的输出是:
| a | b | c |
|---|---|---|
| 2 | 5 | 8 |
| 3 | 6 | 9 |
我想要筛选DataFrame中任意一列满足给定条件的所有行,期望写法类似:
df.loc["*" > 1]
预期输出为:
| a | b | c |
|---|---|---|
| 1 | 4 | 7 |
| 2 | 5 | 8 |
| 3 | 6 | 9 |
我尝试了df[df > 1],但它会将不匹配条件的值设为NaN,输出结果如下:
| a | b | c |
|---|---|---|
| NaN | 4 | 7 |
| 2 | 5 | 8 |
| 3 | 6 | 9 |
解决方案
要实现“任意一列满足条件则保留整行”的筛选,可使用any()方法,它会检查每行中是否至少有一个元素满足条件,返回布尔值序列后再用这个序列筛选行:
df.loc[(df > 1).any(axis=1)]
代码说明
df > 1:生成与原DataFrame形状一致的布尔DataFrame,每个元素标记对应位置是否大于1.any(axis=1):按行(axis=1)校验是否存在至少一个True,返回布尔Series,True代表该行至少有一列满足条件df.loc[...]:通过布尔Series筛选出符合要求的行
执行后即可得到预期输出:
| a | b | c |
|---|---|---|
| 1 | 4 | 7 |
| 2 | 5 | 8 |
| 3 | 6 | 9 |
补充提示
如果需要所有列都满足条件才保留行,只需将any()替换为all():
df.loc[(df > 1).all(axis=1)]
在本例中,这会只保留后两行(所有列值均大于1的行)。
内容的提问来源于stack exchange,提问作者Luc vd Enden
相关产品推荐
相关产品推荐

