我有一个df:
dates p1 p2 p3 p4
2019-12-01 0.4 0.4 0.4 0.3
2019-12-02 0.41 0.3 0.3 0.3
和这样的常量df:
v1 v2 v3
0 43 0.680068 680.068
1 210 0.319932 319.932
2 211 0.319932 319.932
我想将第一个df中的每个元素乘以v3
的每个值,并创建一个将v1作为顶级索引的多重索引-看起来像这样:
43 210 ...
dates p1 p2 p3 p4 ... p1 ...
2019-12-01 0.4 * 680.068 0.4* v3 0.4 * v3 0.3 * v3 ... 0.3 * 319.932
2019-12-02 0.41 * v3 0.3 * v3 0.3 * v3 0.3 * v3 ... ... ...
因此,这将导致1个df具有3个顶级索引(43、210、211),然后到较低的水平将是3个具有逐元素乘法的df
答案 0 :(得分:3)
这是您先前问题的简单扩展。我仍将假设dates
用作初始数据帧的索引,例如df
:
p1 p2 p3 p4
dates
2019-12-01 0.40 0.4 0.4 0.3
2019-12-02 0.41 0.3 0.3 0.3
让我们将v
称为第二个数据帧,并将dg
称为结果。
我们可以简单地使用concat
计算值:
dg = pd.concat([df * val for val in v['v3']], axis = 1)
然后,我们用MultiIndex.from_products
计算列标签:
dg.columns = pd.MultiIndex.from_product([v['v1'], df.columns])
获得:
43 210 211
p1 p2 p3 p4 p1 p2 p3 p4 p1 p2 p3 p4
dates
2019-12-01 272.02720 272.0272 272.0272 204.0204 127.97280 127.9728 127.9728 95.9796 127.97280 127.9728 127.9728 95.9796
2019-12-02 278.82788 204.0204 204.0204 204.0204 131.17212 95.9796 95.9796 95.9796 131.17212 95.9796 95.9796 95.9796
它甚至可以一次完成(感谢anky_91的技巧):
pd.concat([df * val for val in v['v3']], axis = 1,keys=v['v1'])
多索引可以有名称,因此您甚至可以:
dg.columns.names=('v1', '')
获得:
v1 43 210 211
p1 p2 p3 p4 p1 p2 p3 p4 p1 p2 p3 p4
dates
2019-12-01 272.02720 272.0272 272.0272 204.0204 127.97280 127.9728 127.9728 95.9796 127.97280 127.9728 127.9728 95.9796
2019-12-02 278.82788 204.0204 204.0204 204.0204 131.17212 95.9796 95.9796 95.9796 131.17212 95.9796 95.9796 95.9796