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

e3bfsja2  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(130)

我有一个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

字符串
我的意思是:对于第1行,A、B、C的平均值为30/3=10,我希望第1行中的所有值,无论是A还是B或C,都应大于10的40%,即:4.类似地,对于行2和行3。即使有一个元素小于这个值,我们也会删除该行。

**我的尝试:**我使用了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)]


如何动态地做到这一点?- 谢谢-谢谢

iezvtpos

iezvtpos1#

您可以在将每个值与40%的列mean进行比较并与all进行聚合后使用,locgt>)用于轻松处理比较:

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

93ze6v8z

93ze6v8z2#

另一种可能的解决方案:

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

相关问题