2016-06-15 5 views
1

I이처럼 MultiIndex 데이터를 가지고팬더 의해 반환 인덱스 압연 요약 기능 GROUPBY 제어 방법

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 
: 여기
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 

첫번째 인덱스 레벨 위에기로 합산 결과

합리적으로 보입니다 - 색인의 첫 번째 레벨에서 합산되어 두 번째 레벨이 사라졌습니다. 내가 어떤 이유로 팬더의 첫 번째 레벨을 반복, 3 수준의 인덱스를 반환하기로 결정했다

      A   B   C   D 
first first second           
X  X  0   NaN  NaN  NaN  NaN 
      1  1.131120 0.802750 1.062753 0.850648 
      2  1.123434 0.250759 0.782938 0.366903 
Y  Y  0   NaN  NaN  NaN  NaN 
      1  0.564303 0.879768 1.525014 0.868343 
      2  1.256341 0.891075 1.000708 1.281269 
Z  Z  0   NaN  NaN  NaN  NaN 
      1  0.815816 0.884219 0.590062 0.887256 
      2  1.193263 0.816162 0.422251 0.704823 

을 얻을

df.groupby(level=0).rolling(2).sum() 

:하지만 그 대신 만약 내가 rolling 방법을 사용합니다. 왜 이런 일이 일어나는 걸까요? 내 코드를 작성하는 더 좋은 방법이 없으므로 그렇게하지 않습니까?

또한 첫 번째 레이블이 반복되므로 결과에 reset_index()을 호출하면 ValueError: cannot insert first, already exists이되므로 반복되는 인덱스를 삭제하는 방법을 알 수 없습니다. 어떤 팁?

답변

2

사용 group_keys=False :

대조적으로
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 

, 당신은 자신 당신이, 당신이 할 수있는 드롭하고자하는 정지 MultiIndex 수준 붙어 찾을 수 있습니까 경우 MultiIndex.droplevel method :

result = df.groupby(level=0, group_keys=True).rolling(2).sum() 
result.index = result.index.droplevel(level=0) 
+0

고마워. 웬일인지 내 실제 데이터에서 작동하지 않습니다. 나는 몇 초 만에 실제 데이터에 대한 링크를 게시하려고 노력할 것이다. 이 기능이 작동하지 않을 것으로 예상되는 경우가 있습니까? – itzy

+0

나는 어떤 경고도 알지 못하므로 문제를 재현하는 예제를 보는 데 관심이있다. 어쨌든 나는 '물결 모양'을 사용하는 대안적인 방법을 추가했다. – unutbu

+0

감사합니다. 매우 도움이됩니다. 'group_keys = False'로 보일지라도'df [ 'A']보다는'df.groupby() [ 'A'] ... '를하면 여분의 키를 얻습니다. . 이것이 설계 상 또는 버그인지 확실하지 않은 -이 출력이 같아야합니다. – itzy