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



我有一个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 个具有逐个元素乘法的 dfs

这是您上一个问题的简单扩展。我仍然假设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

最新更新