Python 在Groupby中使用列和行多索引值而不取消堆栈

Python 在Groupby中使用列和行多索引值而不取消堆栈,python,pandas,multi-index,Python,Pandas,Multi Index,我有一个多索引层次结构,如下所示: 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.choi

我有一个多索引层次结构,如下所示:

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)
我想按日期和端口进行分组,并对pchg和wts进行汇总

我已经看过文件了,但我很难弄明白这一点


非常感谢您的帮助。谢谢

您确实不需要取消堆栈即可获得所需的内容,使用
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,但仅用于第二级:

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

你能举一个期望输出的例子吗?因为我不能完全理解您是如何看待按
日期
端口
进行分组的(因为它位于不同的轴上)。Is
df.product(axis=1,level=1).groupby(level='dates').mean()
你想要什么?嗨@joris谢谢你看这个。输出应该与(在本例中)
df.stack(port).groupby(level=[1,2]).apply(lambda x:(x['wts']*x[“pchg”]).sum()相同。如果有意义,则取消堆栈('port')
。在实践中,我有许多其他列停止执行堆栈-取消堆栈的往返,并且希望避免处理开销。你说得对,我正试图同时在两个轴上进行分组。我想我的建议正好做到了这一点!谢谢@joris。我要走了,试着弄清楚逻辑。这是令人印象深刻的简洁。谢谢你的帮助。嗨@joris,很抱歉这个天真的问题,但是你能解释一下为什么你用的是“平均”而不是“求和”吗?我无法理解那个部分。谢谢……啊,这是个好问题!我想是因为我犯了一个错误,必须是
sum
,再次阅读你的问题。事实上,它必须是
sum
,才能获得相同的输出(第一行碰巧是相同的)。编辑问题!