代码之家  ›  专栏  ›  技术社区  ›  Chris

将多索引数据帧乘以另一个数据帧的多个标量

  •  1
  • Chris  · 技术社区  · 7 年前

    如何将一列相乘 MultiIndex 具有多个标量的数据帧(来自另一个数据帧)?

    fairly straightforward ,但当涉及到多索引数据帧时,我会感到困惑。有什么建议吗?

    虚拟数据:

    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_unit 对于 Electricity Gas

    1 回复  |  直到 7 年前
        1
  •  1
  •   ALollz    7 年前

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

    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
    ...