Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧列平均值上的布尔运算-这必须很简单_Python_Pandas - Fatal编程技术网

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