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
我有两个数据框; 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