Python 如何使用滚动汇总功能控制pandas groupby返回的索引
我有多索引的数据,如下所示:Python 如何使用滚动汇总功能控制pandas groupby返回的索引,python,pandas,Python,Pandas,我有多索引的数据,如下所示: import itertools idx1 = list('XYZ') idx2 = range(3) idx = pd.MultiIndex.from_tuples(list(itertools.product(idx1,idx2))) df = pd.DataFrame(np.random.rand(9,4), columns=list('ABCD'), index=idx) A B C
import itertools
idx1 = list('XYZ')
idx2 = range(3)
idx = pd.MultiIndex.from_tuples(list(itertools.product(idx1,idx2)))
df = pd.DataFrame(np.random.rand(9,4), columns=list('ABCD'), index=idx)
A B C D
first second
X 0 0.808432 0.708881 0.411515 0.704168
1 0.322688 0.093869 0.651238 0.146480
2 0.800746 0.156890 0.131700 0.220423
Y 0 0.102290 0.129895 0.939147 0.510555
1 0.462014 0.749873 0.585867 0.357788
2 0.794327 0.141203 0.414841 0.923480
Z 0 0.557513 0.768428 0.487475 0.824503
1 0.258303 0.115791 0.102588 0.062753
2 0.934960 0.700371 0.319663 0.642070
以下是在第一个索引级别上按组求和的结果:
In[]: df.groupby(level=0).sum()
Out[]:
A B C D
first
X 1.931866 0.959640 1.194453 1.071071
Y 1.358631 1.020971 1.939855 1.791824
Z 1.750776 1.584590 0.909725 1.529326
似乎是合理的——我对指数的第一级进行了总结,所以第二级已经消失了。但是如果我使用滚动
方法:
df.groupby(level=0).rolling(2).sum()
我明白了
由于某种原因,熊猫决定返回一个三级索引,重复第一级索引。为什么会这样?有没有更好的方法来编写我的代码,这样它就不会这样做
另外,由于第一个标签是重复的,因此在结果上调用reset\u index()
会给出ValueError:cannot insert first,existed
,因此我看不出如何删除重复的索引。有什么建议吗?使用:
相比之下:
In [44]: df.groupby(level=0, group_keys=True).rolling(2).sum()
Out[44]:
A B C D
X X 0 NaN NaN NaN NaN
1 1.244257 1.430957 0.798310 0.779261
2 0.632238 1.512251 1.473498 0.395945
Y Y 0 NaN NaN NaN NaN
1 1.241747 0.865178 0.550665 1.070216
2 1.629892 1.328947 1.046749 1.167371
Z Z 0 NaN NaN NaN NaN
1 0.406606 0.945525 0.936090 1.301093
2 0.701282 0.975851 0.586523 0.698980
顺便说一句,如果您发现自己陷入了想要放弃的多索引级别,您可以使用:
谢谢出于某种原因,这对我的真实数据不起作用。我会试着在一秒钟内发布一些真实数据的链接。在某些情况下,你认为这不起作用吗?我不知道有什么需要注意的,所以我想看一个重现问题的例子。无论如何,我还添加了另一种方法——使用
droplevel
。感谢您提供的详细信息。非常有用。即使使用group\u keys=False
df.groupby()。不确定这是设计还是bug造成的——我认为它们应该有相同的输出。
In [43]: df.groupby(level=0, group_keys=False).rolling(2).sum()
Out[43]:
A B C D
X 0 NaN NaN NaN NaN
1 1.244257 1.430957 0.798310 0.779261
2 0.632238 1.512251 1.473498 0.395945
Y 0 NaN NaN NaN NaN
1 1.241747 0.865178 0.550665 1.070216
2 1.629892 1.328947 1.046749 1.167371
Z 0 NaN NaN NaN NaN
1 0.406606 0.945525 0.936090 1.301093
2 0.701282 0.975851 0.586523 0.698980
In [44]: df.groupby(level=0, group_keys=True).rolling(2).sum()
Out[44]:
A B C D
X X 0 NaN NaN NaN NaN
1 1.244257 1.430957 0.798310 0.779261
2 0.632238 1.512251 1.473498 0.395945
Y Y 0 NaN NaN NaN NaN
1 1.241747 0.865178 0.550665 1.070216
2 1.629892 1.328947 1.046749 1.167371
Z Z 0 NaN NaN NaN NaN
1 0.406606 0.945525 0.936090 1.301093
2 0.701282 0.975851 0.586523 0.698980
result = df.groupby(level=0, group_keys=True).rolling(2).sum()
result.index = result.index.droplevel(level=0)