按列计算带有条件的平均值 Pandas

3

我有一个如下的样本数据框:

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]})

enter image description here

如果这些值不等于1,我希望对'coef1','coef2'和'coef3'求平均值。

我希望我的数据框如下所示: enter image description here

我编写了一个函数并将其应用于我的数据框,并获得了所需的输出,但是我想要一种具有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)
2个回答

2

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

  1. 使用df.where(df.ne(1), np.nan)将值等于1的地方替换为np.nan
  2. 使用df[['coef1', 'coef2', 'coef3']].mean(axis=1))计算每行的平均值(不包括NaNs
  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


2
data['final_coef'] = (
    data[['coef1', 'coef2', 'coef3']][data[['coef1', 'coef2', 'coef3']] != 1]
    .mean(axis=1)
)
data
     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

解释:

这将生成所需的掩码。注意,Date字段无需考虑。

data[['coef1', 'coef2', 'coef3']] != 1

    coef1   coef2   coef3
0   False   False   False
1   True    False   False
2   True    True    False
3   True    True    False
4   True    True    False

然后,您可以按以下方式获取所需的相应数据点:
data[['coef1', 'coef2', 'coef3']][data[['coef1', 'coef2', 'coef3']] != 1]

   coef1 coef2  coef3
0   NaN   NaN   NaN
1   2.0   NaN   NaN
2   5.0   2.0   NaN
3   4.0   6.0   NaN
4   3.0   3.0   NaN

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