选择所有包含大于平均值的百分比的行。

3
我有一个 DataFrame,其中有 3 列数值型列 A、B、C。我需要提取只包含这 3 列 A、B、C 的每行数值大于其行平均值的 40% 的行。
df = pd.DataFrame([['AA',10,8,12],['BB',10,2,18],['CC',10,6,14]],
                  columns=['ID','A', 'B', 'C'])
print(df)
    ID  A   B   C
0   AA  10  8   12
1   BB  10  2   18
2   CC  10  6   14

我的意思是:对于第一行,A、B、C的平均值为30/3=10,我希望在第一行中所有的值,无论是A还是B还是C,都应该大于10的40%,即4。同样地,对于第二行和第三行也是如此。如果有一个元素小于这个值,我们就删除那一行。
我的尝试是:我使用了any()函数,但是当涉及到列的平均值时,它对我没有帮助。我总是得到空的DF
df = df[(df[['A','B','C']] > (0.4*df[['A','B','C']].mean(axis=1))).all(1)]
print(df)
ID  A   B   C

我本来就期待这个的。
    ID  A   B   C
0   AA  10  8   12
2   CC  10  6   14

所有行的平均值为10,所以如果我硬编码它,就会像这样工作:
df[(df[['A','B','C']] > 0.4*10).all(1)]

怎样可以动态地做到这一点? 谢谢。
2个回答

2
您可以在将每个值与列的40%mean进行比较后使用loc,并通过all进行聚合。 gt>)用于方便处理比较。
tmp = df.drop(columns='ID')

out = df.loc[tmp.gt(tmp.mean(axis=1).mul(0.4), axis=0).all(axis=1)]

备选方案:
cols = ['A', 'B', 'C']

df.loc[df[cols].gt(df[cols].mean(axis=1).mul(0.4), axis=0).all(axis=1)]

输出:

   ID   A  B   C
0  AA  10  8  12
2  CC  10  6  14

1
非常感谢您,先生。它解决了问题。 - cph_sto
1
非常感谢,先生。它解决了问题。 - cph_sto
1
非常感谢您,先生。这解决了问题。 - undefined
我在一个更大的数据集上尝试了一下,你回答中的代码不起作用。 - cph_sto
@cph_sto 你能否在你的回答中编辑加入这些细节?这样对于大家来说会更好,也会有更好的格式。请查看我更新后的回答以了解按行过滤的方法。 - mozway
显示剩余14条评论

1
另一个可能的解决方案:
a = df[['A', 'B', 'C']].values

df[(a > 0.4*(a.mean(1)[:, None])).all(1)]

输出:

   ID   A  B   C
0  AA  10  8  12
2  CC  10  6  14

1
非常感谢您的回答。 - cph_sto
1
非常感谢您的回答。 - cph_sto
你的意思是:比较应该是与每列的平均值进行吗? - PaulS
我猜我的更新解决方案解决了你的问题,@cph_sto。 - PaulS
让我深入研究一下。谢谢! - cph_sto
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接