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')
你能举一个期望输出的例子吗?因为我不能完全理解您是如何看待按
日期
和端口
进行分组的(因为它位于不同的轴上)。Isdf.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
,才能获得相同的输出(第一行碰巧是相同的)。编辑问题!