首页 > 解决方案 > 带有条件熊猫的列均值

问题描述

我有一个示例数据框如下:

data = pd.DataFrame({'Date':[20210101,20210102,20210103,20210104,20210105],'coef1':[1,2,5,4,3],'coef2':[1,1,2,6,3],'coef3':[1,1,1,1,1]})

在此处输入图像描述

如果这些值不等于 1,我希望超过 'coef1' 、'coef2' 和 'coef3' 的意思。

我想要的数据框应该如下所示: 在此处输入图像描述

我编写了一个函数并将其应用于我的 datframe 并获得了我想要的输出,但是我想要一种 Python 的方式来实现这一点。

def final_coef(x):
coef_list = []
if x['coef1'] == 1:
    pass
else:
    coef_list.append(x['coef1'])
if x['coef2'] == 1:
    pass
else:
    coef_list.append(x['coef2'])   
if x['coef3'] == 1:
    pass
else:
     coef_list.append(x['coef3'])                       
return np.mean(coef_list)

data['Final_coef'] = data.apply(lambda row: final_coef(row),axis = 1)

标签: pythonmean

解决方案


这可以在一行中完成,但需要执行三个步骤:

  1. 在任何地方应用np.nan一个值等于1usingdf.where(df.ne(1), np.nan)
  2. 使用计算每行的平均值(不NaNs包括在内)df[['coef1', 'coef2', 'coef3']].mean(axis=1))
  3. 将此计算的结果分配给一个新列,使用df.assign()

代码示例

df  = df.assign(final_coef=df.where(df.ne(1), np.nan)[['coef1', 'coef2', 'coef3']].mean(axis=1))

>>>df
       Date  coef1  coef2  coef3  final_coef
0  20210101      1      1      1         NaN
1  20210102      2      1      1         2.0
2  20210103      5      2      1         3.5
3  20210104      4      6      1         5.0
4  20210105      3      3      1         3.0


推荐阅读