提问人:Sudoh 提问时间:7/16/2022 最后编辑:Sudoh 更新时间:7/16/2022 访问量:3753
在 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?
问:
在 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:] >= 10
df[df.iloc[:,1:] >= 10]
我尝试了与该方法相同的方法,并且不会删除至少具有一个错误值的行。df[(df.iloc[:,2:] >= 10).any(1)]
iloc
我怎样才能得到我想要的输出?请注意,我想保留第一列。
编辑:上表是一个示例表,这是我真实表的缩小版本。我的真实表有 109 列,是未来许多表中的第一个。手动提供所有列名根本不是一个有效的解决方案,并且使脚本不可行。
答:
您可以执行此操作来检查行中的所有值是否大于 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)])
评论
df[(df[df.columns[1:]]>10).all(axis=1)]
print(df[(df[df.columns[1:]]>10).all(axis=1)])
df[(df[df.columns[1:]]>10).all(axis=1)]
确实有效。我犯了一个观察错误。我的真实表有 109 列和 22,000 行,我正在测试它们,结果发现其中一些有一个或两个值小于 10 的单元格。谢谢,这奏效了。> 10
df[(df[df.columns[1:]]>x).all(axis=1)]
哪里应该替换为想要测试的值,这对我来说是最简单的答案。这样就可以解析数据帧,而无需手动键入列名。这也假定除第一列之外的所有列都是整数。请注意上面的另一个答案,该答案告诉您,如果您有混合数据,如何记下 dtypes。x
我只是稍微改变了上面的罗德里戈·拉古纳(Rodrigo Laguna)的答案。
评论