Pandas:两个数据帧的行乘法

Pandas: rowwise multiplication of two dataframes

我有两个数据框; A 包含分配分数,B 包含每小时交易量。为了获得给定小时内每辆公交车的正确音量,我需要将 A 与数据帧 B 的每一行相乘。对于给定的小时 (x),这将是 A * B.loc[x].[=16= 的简单乘法]

A =       col_a  col_b  col_c   col_d   col_e               
     0    0.0    0.0    0.0     0.0     1.0
     1    0.0    0.0    1.0     0.0     0.0
     2    0.0    1.0    0.0     0.5     0.0
     3    0.5    0.0    0.0     0.5     0.0
     4    0.5    0.0    0.0     0.0     0.0
B =     col_a   col_b   col_c   col_d   col_e
    0   12881   598     154     180     0.0 
    1   12881   680     154     180     0.0
    2   11617   806     154     180     0.0
    3   12991   100     154     180     0.0

但是,我想立即对每个小时进行一次乘法运算,并创建一个大型多索引数据帧 C。

C =          col_a   col_b  col_c  col_d  col_e
    hr  bus                     
    0   0    0.0     0.0    0.0    0.0   0.0
        1    0.0     0.0    154.0  0.0   0.0
        2    0.0     598.0  0.0    90.0  0.0
        3    6440.5  0.0    0.0    90.0  0.0
        4    6440.5  0.0    0.0    0.0   0.0
    1   0    0.0     0.0    0.0    0.0   0.0
        1    0.0     0.0    154.0  0.0   0.0
        2    0.0     680.0  0.0    90.0  0.0

我设法通过列表操作创建了这个数据框,并覆盖了生成的数据框的索引。我不认为这是一个很好的做法,想知道是否有更好的方法不需要覆盖索引?

dfs = [A.mul(B.loc[i]) for i in B.index]
C = pandas.concat(dfs)

C.index = pandas.MultiIndex.from_product([B.index, A.index], names=['hr', 'bus'])

首先“复制”B DataFrame,重新格式化索引:

BB = pd.DataFrame(np.repeat(B.values, A.index.size, axis=0), columns=B.columns,
    index=pd.MultiIndex.from_product((B.index, A.index), names=['hr', 'bus']))

然后计算结果:

result = A.mul(BB, level=1)

结果是:

         col_a  col_b  col_c  col_d  col_e
hr bus                                    
0  0       0.0    0.0    0.0    0.0    0.0
   1       0.0    0.0  154.0    0.0    0.0
   2       0.0  598.0    0.0   90.0    0.0
   3    6440.5    0.0    0.0   90.0    0.0
   4    6440.5    0.0    0.0    0.0    0.0
1  0       0.0    0.0    0.0    0.0    0.0
   1       0.0    0.0  154.0    0.0    0.0
   2       0.0  680.0    0.0   90.0    0.0
   3    6440.5    0.0    0.0   90.0    0.0
   4    6440.5    0.0    0.0    0.0    0.0
2  0       0.0    0.0    0.0    0.0    0.0
   1       0.0    0.0  154.0    0.0    0.0
   2       0.0  806.0    0.0   90.0    0.0
   3    5808.5    0.0    0.0   90.0    0.0
   4    5808.5    0.0    0.0    0.0    0.0
3  0       0.0    0.0    0.0    0.0    0.0
   1       0.0    0.0  154.0    0.0    0.0
   2       0.0  100.0    0.0   90.0    0.0
   3    6495.5    0.0    0.0   90.0    0.0
   4    6495.5    0.0    0.0    0.0    0.0