将MultiIndex Pandas数据框乘以另一个数据框的多个标量

时间:2019-02-05 17:02:29

标签: python pandas

如何将MultiIndex数据框中的一列乘以几个标量(来自另一个数据框)?

对于普通的数据帧,它是fairly straightforward,但是当它进入MultiIndex数据帧时,我会感到困惑。有什么建议吗?

虚拟数据:

import pandas as pd
import numpy as np

def mklbl(prefix, n):
    return ["%s%s" % (prefix, i) for i in range(n)]

miindex = pd.MultiIndex.from_product([mklbl('C', 4), mklbl('D', 2)])
micolumns = pd.MultiIndex.from_tuples([('Baseline', 'Electricity'), ('Baseline', 'Gas'), ('Consumption', 'Electricity'), ('Consumption', 'Gas')])
df = pd.DataFrame(np.arange(len(miindex) * len(micolumns))
                        .reshape((len(miindex), len(micolumns))),
                         index=miindex,
                  columns= micolumns)

cost = pd.DataFrame([['Electricity', 0.12],['Gas', 0.03]], columns=['fuel__name', 'cost_per_unit'])

预期输出是虚拟数据乘以cost_per_unitElectricity的相应Gas(即能源使用成本)

1 个答案:

答案 0 :(得分:1)

将列的第一级映射到值并相乘:

df_res = df*df.columns.get_level_values(1).map(cost.set_index('fuel__name').cost_per_unit)
print(df_res)

         Baseline       Consumption      
      Electricity   Gas Electricity   Gas
C0 D0        0.00  0.03        0.24  0.09
   D1        0.48  0.15        0.72  0.21
C1 D0        0.96  0.27        1.20  0.33
   D1        1.44  0.39        1.68  0.45
C2 D0        1.92  0.51        2.16  0.57
   D1        2.40  0.63        2.64  0.69
C3 D0        2.88  0.75        3.12  0.81
   D1        3.36  0.87        3.60  0.93

如果只需要乘以特定的子集,则可以用各种方法对MultiIndex进行切片,然后仅对这些子集执行操作。

import pandas as pd
df.loc[:, df.columns.get_level_values(1) == 'Electricity']

         Baseline Consumption
      Electricity Electricity
C0 D0           0           2
   D1           4           6
C1 D0           8          10
...

使用pd.IndexSlice

可能更简洁易读
idx = pd.IndexSlice
df.loc[:, idx[:, 'Electricity']]

         Baseline Consumption
      Electricity Electricity
C0 D0           0           2
   D1           4           6
C1 D0           8          10
...