我有一个熊猫数据框,其中有不同的国家(行)和4个指标(列)A,B,C和D.
对于每个指标,我都有一个特定的权重用于计算其加权总和,比如说:Weigth_A = 0.2,Weigth_B = 0.2,Weight_C = 0.4,Weight_D = 0.2
这是我的加权总和的公式
df['W_Sum'] = Weigth_A*df['A'] + Weigth_B*df['B'] + Weigth_C*df['C'] + Weigth_D*df['D']
但是,如果某列为NaN(在这种情况下为D),则需要将加权和更改为正常平均值;
df['W_Sum'] = 0.33*df['A'] + 0.33*df['B'] + 0.33*df['C']
如果缺少两个,则:
df['W_Sum'] = 0.5*df['A'] + 0.5*df['B']
有一种方法可以自动执行此过程,因为我不确定每个国家/地区的哪一列都会缺少值?
谢谢!
最佳答案
您可以为此使用
np.where
:
wa = 0.2*df.A + 0.4*df.B + 0.2*df.C
df['new_col'] = np.where(df.isna().any(axis=1),df.mean(axis=1),wa)
例
df = pd.DataFrame({'A':[1,2,3],'B':[4,5,6],'C':[7,8,np.nan]})
A B C
0 1 4 7.0
1 2 5 8.0
2 3 6 NaN
wa = 0.2*df.A + 0.4*df.B + 0.2*df.C
df['new_col'] = np.where(df.isna().any(axis=1),wa)
A B C new_col
0 1 4 7.0 3.2
1 2 5 8.0 4.0
2 3 6 NaN 4.5
细节
np.where将根据条件has_nans的结果在平均值或加权平均值中进行选择:
df.assign(has_nans = df.isna().any(axis=1),mean=df.mean(axis=1),weighted_av = wa)
A B C new_col has_nans mean weighted_av
0 1 4 7.0 3.2 False 3.80 3.2
1 2 5 8.0 4.0 False 4.75 4.0
2 3 6 NaN 4.5 True 4.50 NaN