在 pandas 中,如何筛选 ALL 值高于特定阈值的行?并将索引列与输出一起保留?

In pandas, how can I filter for rows where ALL values are higher than a certain threshold? And keep the index columns with the output?

提问人:Sudoh 提问时间:7/16/2022 最后编辑:Sudoh 更新时间:7/16/2022 访问量:3753

问:

在 pandas 中,如何筛选 ALL 值高于特定阈值的行?

假设我有一个如下所示的表:

城市 鸟类一 鸟类二 鸟类种类三 鸟类四种
一个 7 11 13 16
B 11 12 13 14
C 20 21 22 23
D 8 6 4 5

现在我只想获得 ALL COUNTS 大于 10 的行。这里是 B 行和 C 行。

所以我想要的输出是:

城市 鸟类一 鸟类二 鸟类种类三 鸟类四种
B 11 12 13 14
C 20 21 22 23

因此,即使单个值为 false,我也希望删除该行。例如,在示例表中,行 A 只有一个值小于 10,但它被丢弃了。

我尝试这样做,它创建了一个布尔表,如果我这样做,它会给我显示哪些单元格满足条件的表格,但由于第一列是字符串,因此所有列都标记为 false,并且我在那里丢失了数据,结果发现 false 的单元格也留在那里。df.iloc[:,1:] >= 10df[df.iloc[:,1:] >= 10]

我尝试了与该方法相同的方法,并且不会删除至少具有一个错误值的行。df[(df.iloc[:,2:] >= 10).any(1)]iloc

我怎样才能得到我想要的输出?请注意,我想保留第一列。

编辑:上表是一个示例表,这是我真实表的缩小版本。我的真实表有 109 列,是未来许多表中的第一个。手动提供所有列名根本不是一个有效的解决方案,并且使脚本不可行。

Python Pandas 数据帧

评论


答:

3赞 Rodrigo Laguna 7/16/2022 #1

您可以执行此操作来检查行中的所有值是否大于 10:

import pandas as pd

df = pd.DataFrame({
    'city': ['A','B','C','D'],
    'one': [7,11,20,8],
    'two': [11,12,21,6],
    'three': [13,13,22,4],
    'four': [16,14,23,5],
})

print(df[(df[['one', 'two', 'three']]>10).all(axis=1)])

输出为:

  city  one  two  three  four
1    B   11   12     13    14
2    C   20   21     22    23

您还可以将其修改为仅在具有整数 dtype 的列中进行筛选,如下所示:

print(df[(
    df[[c for c, t in zip(df.columns, df.dtypes) if pd.api.types.is_integer_dtype(t)]]>10
).all(axis=1)])

格式完全相同。但是,您可能需要根据 DataFrame 中的 dtypes 进行一些调整。

假设唯一的非数字列是第一个列,那么可以按如下方式对其进行简化:

print(df[(df[df.columns[1:]]>10).all(axis=1)])

评论

1赞 Sudoh 7/16/2022
'str' 和 'int'' 的实例之间不支持 ' >。第一列是字符串,其余是整数。我想保留第一列。
1赞 Rodrigo Laguna 7/16/2022
查看我的更新
1赞 Sudoh 7/16/2022
你知道为什么行不通吗?df[(df[df.columns[1:]]>10).all(axis=1)]
1赞 Rodrigo Laguna 7/16/2022
它对我有用,但这假设您唯一的非数字是第一列:print(df[(df[df.columns[1:]]>10).all(axis=1)])
1赞 Sudoh 7/16/2022
df[(df[df.columns[1:]]>10).all(axis=1)]确实有效。我犯了一个观察错误。我的真实表有 109 列和 22,000 行,我正在测试它们,结果发现其中一些有一个或两个值小于 10 的单元格。谢谢,这奏效了。> 10
1赞 Sudoh 7/16/2022 #2

df[(df[df.columns[1:]]>x).all(axis=1)]哪里应该替换为想要测试的值,这对我来说是最简单的答案。这样就可以解析数据帧,而无需手动键入列名。这也假定除第一列之外的所有列都是整数。请注意上面的另一个答案,该答案告诉您,如果您有混合数据,如何记下 dtypes。x

我只是稍微改变了上面的罗德里戈·拉古纳(Rodrigo Laguna)的答案。