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)