在Pandas Groupby中使用列和行多索引值,而不取消堆叠

2024-06-25 23:12:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个多索引层次结构,设置如下:

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)

我想按dates和{}分组,求和pchg*wts

我已经看过医生了,但我正在努力弄清楚。在

非常感谢任何帮助。谢谢


Tags: importnumpydf层次结构portasnprandom
1条回答
网友
1楼 · 发布于 2024-06-25 23:12:34

您确实不需要取消堆叠就可以得到想要的结果,使用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

我们可以先用^{}方法做pchg * wts部分,乘以轴1,但仅限于第二个级别:

^{pr2}$

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

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')

相关问题 更多 >