gpt4 book ai didi

python - 在 Pandas Groupby 中使用列和行多索引值,无需拆栈

转载 作者:太空宇宙 更新时间:2023-11-03 17:57:33 26 4
gpt4 key购买 nike

我的多索引层次结构设置如下:

import numpy as np

sectors = ['A','B','C','D']
ports = ['pf','bm']
dates = range(1,11)*2
wts, pchg = zip(*np.random.randn(20,2))
df = pd.DataFrame(dict(dates=dates,port=sorted(ports*10),
sector=np.random.choice(sectors,20), wts=wts,
pchg=pchg))

df = df.set_index(['port','sector','dates'])
df = df.unstack('port')
df = df.fillna(0)

我想按 datesport 进行分组,并求和 pchg * wts

我已经阅读了文档,但我正在努力弄清楚这一点。

非常感谢任何帮助。谢谢

最佳答案

您确实不需要 unstack 来获得您想要的东西,使用 product 方法来进行您想要的乘法。一步一步:

从此数据框开始:

In [50]: df.head()
Out[50]:
pchg wts
port bm pf bm pf
sector dates
A 1 0.138996 0.451688 0.763287 -1.863401
3 1.081863 0.000000 0.956807 0.000000
4 0.207065 0.000000 -0.663175 0.000000
5 0.258293 -0.868822 0.109336 -0.784900
6 -1.016700 0.900241 -0.054077 -1.253191

我们可以首先使用 product 执行 pchg * wts 部分方法,乘以轴 1,但仅适用于第二层:

In [51]: df.product(axis=1, level=1).head()
Out[51]:
port bm pf
sector dates
A 1 0.106094 -0.841675
3 1.035134 0.000000
4 -0.137320 0.000000
5 0.028241 0.681938
6 0.054980 -1.128174

然后我们可以按日期分组(不再需要按端口分组)并求和:

In [52]: df.product(axis=1, level=1).groupby(level='dates').sum()
Out[52]:
port bm pf
dates
1 0.106094 -0.841675
2 0.024968 1.357746
3 1.035134 1.776464
4 -0.137320 0.392312
5 0.028241 0.681938
6 0.054980 -1.128174
7 0.140183 -0.338828
8 1.296028 -1.526065
9 -0.213989 0.469104
10 0.058369 -0.006564

这给出了与

相同的输出
df.stack('port').groupby(level=[1,2]).apply(lambda x: (x['wts']*x["pchg"]).sum()).unstack('port')

关于python - 在 Pandas Groupby 中使用列和行多索引值,无需拆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28273699/

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