Pandas 对应列之间的和积-熊猫/Numpy
我想添加列并在相应的列(按名称)上应用求和积 数据说明:Pandas 对应列之间的和积-熊猫/Numpy,pandas,numpy,Pandas,Numpy,我想添加列并在相应的列(按名称)上应用求和积 数据说明: VAR1 VAR2 1834_Value 1673_Value 153_Value 0_Value 1834_Prob 0_Prob 1673_Prob 153_Prob 4 1 10 20 30 40 0.100 0.400 0.200 0.300 1 3 28
VAR1 VAR2 1834_Value 1673_Value 153_Value 0_Value 1834_Prob 0_Prob 1673_Prob 153_Prob
4 1 10 20 30 40 0.100 0.400 0.200 0.300
1 3 28 79 88 36 0.187 0.057 0.181 0.574
3 3 30 72 59 95 0.227 0.050 0.171 0.552
4 2 55 46 85 97 NaN NaN NaN NaN
1 2 28 41 62 64 0.251 0.092 0.084 0.573
5 1 82 51 21 24 NaN NaN NaN NaN
2 2 27 90 71 83 0.114 0.003 0.131 0.751
5 2 97 94 46 46 0.285 0.112 0.126 0.477
2 5 27 66 73 44 NaN NaN NaN NaN
1 5 39 76 90 58 NaN NaN NaN NaN
5 2 63 71 47 92 0.279 0.163 0.212 0.346
例如:第一行的值应该是:0.1*10+0.2*20+0.3*30+0.4*40
=
30
- 注:各列不按顺序排列
VAR1 VAR2 1834_Value 1673_Value 153_Value 0_Value 1834_Prob 0_Prob 1673_Prob 153_Prob SumProduct
4 1 10 20 30 40 0.100 0.400 0.200 0.300 30.000
1 3 28 79 88 36 0.187 0.057 0.181 0.574 72.175
3 3 30 72 59 95 0.227 0.050 0.171 0.552 56.464
4 2 55 46 85 97 NaN NaN NaN NaN NaN
1 2 28 41 62 64 0.251 0.092 0.084 0.573 51.885
5 1 82 51 21 24 NaN NaN NaN NaN NaN
2 2 27 90 71 83 0.114 0.003 0.131 0.751 68.523
5 2 97 94 46 46 0.285 0.112 0.126 0.477 66.570
2 5 27 66 73 44 NaN NaN NaN NaN NaN
1 5 39 76 90 58 NaN NaN NaN NaN NaN
5 2 63 71 47 92 0.279 0.163 0.212 0.346 63.905
这里有一个方法:
m=df.set_index(['VAR1','VAR2'])
m.groupby(m.columns.str.split('_').str[0],axis=1,sort=False).prod().sum(1) #.reset_index()
以下是我的方法:
s = df.iloc[:,2:]
df['sum_prod'] = (s.groupby(s.columns.str.extract('^(\d+)')[0].values,
axis=1)
.prod(min_count=2).sum(1, skipna=False)
)
print(df['sum_prod'])
输出:
0 30.000
1 72.099
2 56.440
3 NaN
4 51.886
5 NaN
6 68.438
7 66.583
8 NaN
9 NaN
10 63.887
Name: sum_prod, dtype: float64
为了简单起见,我将
\u Value
切片到一个数据帧中,将\u Prob
切片到另一个数据帧中,然后进行乘法和求和
df_value = df.filter(like='_Value').sort_index(axis=1)
df_prob = df.filter(like='_Prob').sort_index(axis=1)
df['SumProduct'] = df_value.mul(df_prob.values).sum(1, skipna=False)
Out[604]:
VAR1 VAR2 1834_Value 1673_Value 153_Value 0_Value 1834_Prob 0_Prob \
0 4 1 10 20 30 40 0.100 0.400
1 1 3 28 79 88 36 0.187 0.057
2 3 3 30 72 59 95 0.227 0.050
3 4 2 55 46 85 97 NaN NaN
4 1 2 28 41 62 64 0.251 0.092
5 5 1 82 51 21 24 NaN NaN
6 2 2 27 90 71 83 0.114 0.003
7 5 2 97 94 46 46 0.285 0.112
8 2 5 27 66 73 44 NaN NaN
9 1 5 39 76 90 58 NaN NaN
10 5 2 63 71 47 92 0.279 0.163
1673_Prob 153_Prob SumProduct
0 0.200 0.300 30.000
1 0.181 0.574 72.099
2 0.171 0.552 56.440
3 NaN NaN NaN
4 0.084 0.573 51.886
5 NaN NaN NaN
6 0.131 0.751 68.438
7 0.126 0.477 66.583
8 NaN NaN NaN
9 NaN NaN NaN
10 0.212 0.346 63.887
基本上,您需要的是列的元素级乘法,然后沿轴1求和
columns = ['1834', '1673', '153', '0']
values = df[f"{i}_Value" for i in columns].values
probs = df[f"{i}_Prob" for i in columns].values
df['sum_product'] = np.multiply(values, probs).sum(axis = 1)
列的标签是否一致?比如1834_值总是乘以1834_prob?是的,它们是。你有多少个VAR列?有一个整数列表:
[015316731834]
。我编辑了我的问题,并在“prob”列中添加了NaN
值。此外,还更新了预期结果。
columns = ['1834', '1673', '153', '0']
values = df[f"{i}_Value" for i in columns].values
probs = df[f"{i}_Prob" for i in columns].values
df['sum_product'] = np.multiply(values, probs).sum(axis = 1)