Python 数据帧列平均值上的布尔运算-这必须很简单
我至少有一个数据帧:Python 数据帧列平均值上的布尔运算-这必须很简单,python,pandas,Python,Pandas,我至少有一个数据帧: import pandas as pd import numpy as np df = pd.DataFrame({'A':[1,5,3], 'B': [4,2,6]}) df['avg'] = df.mean(axis=1) df[df<df['avg']] 我该怎么做?必须有一种类似于蟒蛇的方法才能做到这一点。您可以在这里使用。我们可以使用numpy的广播生成一组高于给定平均值的布尔值: >>> df.m
import pandas as pd
import numpy as np
df = pd.DataFrame({'A':[1,5,3],
'B': [4,2,6]})
df['avg'] = df.mean(axis=1)
df[df<df['avg']]
我该怎么做?必须有一种类似于蟒蛇的方法才能做到这一点。您可以在这里使用。我们可以使用numpy的广播生成一组高于给定平均值的布尔值:
>>> df.mask(df.values > df['avg'].values[:,None])
A B avg
0 1.0 NaN 2.5
1 NaN 2.0 3.5
2 3.0 NaN 4.5
我认为这比公认的解决方案更为惯用和清晰:
将numpy导入为np
作为pd进口熊猫
df=pd.DataFrame({'A':[1,5,3],
‘B’:[4,2,6]})
打印(df)
df['avg']=df.平均值(轴=1)
打印(df)
df[df['A',B'].ge(df['avg'],轴=0)]=np.NaN
打印(df)
输出:
ab
0 1 4
1 5 2
2 3 6
平均值
0 1 4 2.5
1 5 2 3.5
2 3 6 4.5
平均值
01.02.5
1.2.03.5
2.3.0 NaN 4.5
说到公认的解决方案,不再建议使用
.values
将Pandas数据帧或系列转换为NumPy数组。幸运的是,我们实际上根本不需要在这里使用它:
df.mask(df>df['avg'][:,np.newaxis])
谢谢。我仍然需要做一些工作来理解你所做的,但我很高兴你给了我我所需要的。非常感谢。通过向数据帧(df.values)添加“.values”,您创建了一个numpy数组。通过将其添加到df['avg].values,您创建了第二个numpy数组。通过添加.values[:,None]您做了什么?我注意到None对应于一列。请注意,现在不鼓励使用.values
,而支持.to\u numpy()
。它在这里的使用实际上是完全没有必要的。@getaglow通过添加.values[:,None]您做了什么?我注意到None对应于一列。我不是写答案的人,但你可以找到更多。
col_names = ['A', 'B']
for colname in col_names:
df[colname] = df[colname]<df['avg']
df_desired = pd.DataFrame({
'A':[1,np.nan,3],
'B':[np.nan,2,np.nan],
'avg' :[2.5, 3.5, 4.5]
})
>>> df.mask(df.values > df['avg'].values[:,None])
A B avg
0 1.0 NaN 2.5
1 NaN 2.0 3.5
2 3.0 NaN 4.5