根据阈值筛选熊猫中的行



>我有以下数据框。

A1  A2  A3  B1  B2  B3  C1  C2  C3
0   0   0   1   1   1   1   0   1   1
1   0   0   0   0   0   0   0   0   0
2   1   1   1   0   1   1   1   1   1

我希望根据列组和非零的出现来过滤它。我写了以下内容来实现它。

import pandas as pd
df = pd.read_csv("TEST_TABLE.txt", sep='t')
print(df)
group1 = ['A1','A2','A3']
group2 = ['B1','B2','B3']
group3 = ['C1','C2','C3']
df2 = df[(df[group1] !=0).any(axis=1) & (df[group2] !=0).any(axis=1) & (df[group3] !=0).any(axis=1)]
print(df2)

输出非常完美:

A1  A2  A3  B1  B2  B3  C1  C2  C3
0   0   0   1   1   1   1   0   1   1
2   1   1   1   0   1   1   1   1   1

现在,如何修改代码,以便我可以为"any"强加一个阈值,即为每个组保留至少 2 个非零的行。因此,最终输出将给出

A1  A2  A3  B1  B2  B3  C1  C2  C3
2   1   1   1   0   1   1   1   1   1

提前谢谢。

您可以通过sum对非0值进行计数,并通过按ge比较 (>=( 和最后约简蒙版循环创建布尔掩码:

groups = [group1,group2,group3]
df2 = df[np.logical_and.reduce([(df[g]!=0).sum(axis=1).ge(2) for g in groups])]
print(df2)
A1  A2  A3  B1  B2  B3  C1  C2  C3
2   1   1   1   0   1   1   1   1   1

详情

print([(df[g]!=0).sum(axis=1).ge(2) for g in groups])
[0    False
1    False
2     True
dtype: bool, 0     True
1    False
2     True
dtype: bool, 0     True
1    False
2     True
dtype: bool]

最新更新