如何将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_unit
和Electricity
的相应Gas
(即能源使用成本)
答案 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
...