熊猫数据框:在进行涉及两个数据框的算术运算时如何在多个索引级别上进行匹配

Posted

技术标签:

【中文标题】熊猫数据框:在进行涉及两个数据框的算术运算时如何在多个索引级别上进行匹配【英文标题】:pandas dataframe: how to match on multiple index levels when doing arithmetic operations involving two dataframes 【发布时间】:2013-02-20 03:30:02 【问题描述】:

我有一个在主索引上有三个级别的 DataFrame:

from pandas import *
df_multi = DataFrame(np.random.rand(6,2), index = [['CF', 'CF', 'CF', 'DA', 'DA','DA'], ['x', 'y', 'y', 'x', 'y', 'y'], ['a', 'b', 'a', 'a', 'a', 'b']], columns = ['PC1', 'PC2'])
df_multi.index.names =['l1','l2','l3']

In [5]: df_multi
Out[5]: 
       PC1       PC2
l1 l2 l3                    
CF x  a   0.118061  0.473159
   y  b   0.159534  0.407676
      a   0.466731  0.163322
DA x  a   0.152799  0.333438
   y  a   0.632725  0.965348
      b   0.737112  0.834592

现在我想对第三级求和,然后将每个元素除以其相应的总和以获得第三级的份额(例如,将(CF, x, a) 除以(CF, x, a)(CF, y, a) 除以(CF, y, a) + (CF, y, b) 等)

In [6]: df_multi.sum(level = [0, 1])
Out[6]: 
    PC1       PC2
l1 l2                    
CF x   0.118061  0.473159
   y   0.626265  0.570998
DA x   0.152799  0.333438
   y   1.369837  1.799940

df_multi_share = df_multi.div(df_multi.sum(level = [0, 1]), level=[0, 1])

但是这不起作用。我正在寻找一个通用的解决方案,不仅限于百分比份额的计算,它使我能够在多个级别上进行算术匹配。仅使用一个级别时它确实有效,例如

df_multi = DataFrame(np.random.rand(4,2), index = [['CF', 'CF', 'DA', 'DA'], ['1', '2', '1', '2']], columns = ['PC1', 'PC2'])

df_single = DataFrame(np.random.rand(3,3), index = ['1', '2', '3'], columns = ['PC1', 'PC2', 'PC3'])

df_combined = df_multi.mul(df_single, level = 1)

【问题讨论】:

【参考方案1】:

这听起来像是transform 的工作。

df_multi.groupby(level=[0,1]).transform(lambda x: x/x.sum())

相关文档: http://pandas.pydata.org/pandas-docs/stable/groupby.html#transformation

【讨论】:

谢谢,艾伦。我更深入地研究了 .apply 和 .transform。但是,这似乎允许在组级别执行功能。这是我的特殊情况的解决方案。但是,我很乐意找到一个更通用的解决方案,它允许我添加例如 dataframe1 和 dataframe2 ,其中我不仅匹配一个级别的多索引,而且匹配多个级别。例如。 dataframe1有3层,dataframe2有2层,我想把这两个dataframe相加,把dataframe2的两层和dataframe1的二三层匹配,沿着dataframe1的第一层广播。

以上是关于熊猫数据框:在进行涉及两个数据框的算术运算时如何在多个索引级别上进行匹配的主要内容,如果未能解决你的问题,请参考以下文章

比较两个熊猫数据框的差异

按行分组时如何合并熊猫数据框的字典

如何将一个熊猫数据框的一列与另一个数据框的每一列相加?

如何使用 Seaborn 并排绘制熊猫数据框的多组列

两个熊猫数据框的联合

如何在熊猫数据框的行之间应用多个条件创建目标数据框