通过将df乘以N个常数来创建多索引熊猫df

时间:2020-02-15 13:39:38

标签: python python-3.x pandas

我有一个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

1 个答案:

答案 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