【问题标题】:Pandas: rowwise multiplication of two dataframesPandas:两个数据帧的行乘法
【发布时间】:2020-12-05 02:07:41
【问题描述】:

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

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'])

【问题讨论】:

    标签: python python-3.x pandas dataframe multiplication


    【解决方案1】:

    第一个“复制”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
    

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 2020-06-24
      相关资源
      最近更新 更多