首页 > 解决方案 > 使用公共密钥在数据帧上广播系列乘法

问题描述

我有一个数据框和一个熊猫系列

数据框包含我需要用来乘以我的系列的权重。两个对象共享相同的密钥Key

以下是df我拥有的数据框():

Col               3         5
Key    Idx2                    
1      1      0.571429  0.000000
       4      0.200000  0.000000
       5      0.000000  0.228571
2      6      1.000000  0.000000
6      5      0.000000  1.000000
7      5      0.088235  0.882353
       6      0.029412  0.000000
8      5      0.727273  0.272727
11     2      1.000000  0.000000
12     1      0.158730  0.000000
       5      0.000000  0.595238
       6      0.011905  0.000000
       2      0.019841  0.000000
       3      0.150794  0.063492
13     2      1.000000  0.000000
14     2      1.000000  0.000000
15     2      1.000000  0.000000

这是系列 ( s) :

Key
1     106.0
2     270.0
3     378.0
4      78.0
5      80.0
6       0.0
7       0.0
8       0.0
9       0.0
10      0.0
11      0.0
12      0.0
13      0.0
14      0.0
15      0.0

我不确定如何正确地将两者相乘,以便保持 in 的形状df并将每个值乘以 indf对应的Keys

所需的输出将是:


Col               3         5
Key    Idx2                    
1      1      60.57147  0.000000
       4      21.20000  0.000000
       5      0.000000  24.22853
2      6      270.0000  0.000000
6      5      0.000000  0.000000
7      5      0.000000  0.000000
       6      0.000000  0.000000
8      5      0.000000  0.000000
11     2      0.000000  0.000000
12     1      0.000000  0.000000
       5      0.000000  0.000000
       6      0.000000  0.000000
       2      0.000000  0.000000
       3      0.000000  0.000000
13     2      0.000000  0.000000
14     2      0.000000  0.000000
15     2      0.000000  0.000000

我想要做的是使用df.mul,但似乎这样我正在执行一个元素一个元素的乘法:

df.mul(s, fill_value = 0)

              1   2           3   4          5   6   ...  10  11  12  13  14  15
Key    Idx2                                          ...                        
1      1     NaN NaN  216.000000 NaN   0.000000 NaN  ... NaN NaN NaN NaN NaN NaN
       4     NaN NaN   75.600000 NaN   0.000000 NaN  ... NaN NaN NaN NaN NaN NaN
       5     NaN NaN    0.000000 NaN  18.285714 NaN  ... NaN NaN NaN NaN NaN NaN
2      6     NaN NaN  378.000000 NaN   0.000000 NaN  ... NaN NaN NaN NaN NaN NaN
6      5     NaN NaN    0.000000 NaN  80.000000 NaN  ... NaN NaN NaN NaN NaN NaN
7      5     NaN NaN   33.352941 NaN  70.588235 NaN  ... NaN NaN NaN NaN NaN NaN
       6     NaN NaN   11.117647 NaN   0.000000 NaN  ... NaN NaN NaN NaN NaN NaN
8      5     NaN NaN  274.909091 NaN  21.818182 NaN  ... NaN NaN NaN NaN NaN NaN
11     2     NaN NaN  378.000000 NaN   0.000000 NaN  ... NaN NaN NaN NaN NaN NaN
12     1     NaN NaN   60.000000 NaN   0.000000 NaN  ... NaN NaN NaN NaN NaN NaN
       5     NaN NaN    0.000000 NaN  47.619048 NaN  ... NaN NaN NaN NaN NaN NaN
       6     NaN NaN    4.500000 NaN   0.000000 NaN  ... NaN NaN NaN NaN NaN NaN
       2     NaN NaN    7.500000 NaN   0.000000 NaN  ... NaN NaN NaN NaN NaN NaN
       3     NaN NaN   57.000000 NaN   5.079365 NaN  ... NaN NaN NaN NaN NaN NaN
13     2     NaN NaN  378.000000 NaN   0.000000 NaN  ... NaN NaN NaN NaN NaN NaN
14     2     NaN NaN  378.000000 NaN   0.000000 NaN  ... NaN NaN NaN NaN NaN NaN
15     2     NaN NaN  378.000000 NaN   0.000000 NaN  ... NaN NaN NaN NaN NaN NaN

标签: pythonpandas

解决方案


对我来说工作axis=0level=0参数DataFrame.mul

df = df.mul(s, axis=0, level=0)
print (df)
                   3          5
Key Idx2                       
1   1      60.571474   0.000000
    4      21.200000   0.000000
    5       0.000000  24.228526
2   6     270.000000   0.000000
6   5       0.000000   0.000000
7   5       0.000000   0.000000
    6       0.000000   0.000000
8   5       0.000000   0.000000
11  2       0.000000   0.000000
12  1       0.000000   0.000000
    5       0.000000   0.000000
    6       0.000000   0.000000
    2       0.000000   0.000000
    3       0.000000   0.000000
13  2       0.000000   0.000000
14  2       0.000000   0.000000
15  2       0.000000   0.000000

推荐阅读