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)