gpt4 book ai didi

indexing - Pandas 数据框 : how to match on multiple index levels when doing arithmetic operations involving two dataframes

转载 作者:行者123 更新时间:2023-12-02 02:05:34 25 4
gpt4 key购买 nike

我在主索引上有一个包含三个级别的 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)

最佳答案

这听起来像是transform的工作。

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

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

关于indexing - Pandas 数据框 : how to match on multiple index levels when doing arithmetic operations involving two dataframes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15228744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com