2014-06-04 4 views
3

코드 (아래)는 특정 그룹 순서 이 항상이 원본 데이터 프레임과 동일하게 유지되도록 지정하려고합니다.그룹 적용 함수 내에서의 순서

내 작은 예제를 위해 그룹 내의 순서가 유지되는 것처럼 보이지만 1 백만 개의 레코드가있는 데이터 프레임이 있다면 어떻게 될까요? 팬더가 그러한 보증을 제공 할 것인가? 나 혼자서 그것에 대해 걱정해야만 하는가?

코드 :

import numpy as np 
import pandas as pd 

N = 10 
df = pd.DataFrame(index = xrange(N)) 
df['A'] = map(lambda x: int(x)/5, np.random.randn(N) * 10.0) 
df['B'] = map(lambda x: int(x)/5, np.random.randn(N) * 10.0) 
df['v'] = np.random.randn(N) 

def show_x(x): 
    print x 
    print "----------------" 
df.groupby('A').apply(show_x) 
print "===============" 
print df 

출력 :

A B   v 
6 -4 -1 -2.047354 

[1 rows x 3 columns] 
---------------- 
    A B   v 
6 -4 -1 -2.047354 

[1 rows x 3 columns] 
---------------- 
    A B   v 
8 -3 0 -1.190831 

[1 rows x 3 columns] 
---------------- 
    A B   v 
0 -1 -1 0.456397 
9 -1 -2 -1.329169 

[2 rows x 3 columns] 
---------------- 
    A B   v 
1 0 0 0.663928 
2 0 2 0.626204 
7 0 -3 -0.539166 

[3 rows x 3 columns] 
---------------- 
    A B   v 
4 2 2 -1.115721 
5 2 1 -1.905266 

[2 rows x 3 columns] 
---------------- 
    A B   v 
3 4 -1 0.751016 

[1 rows x 3 columns] 
---------------- 
=============== 
    A B   v 
0 -1 -1 0.456397 
1 0 0 0.663928 
2 0 2 0.626204 
3 4 -1 0.751016 
4 2 2 -1.115721 
5 2 1 -1.905266 
6 -4 -1 -2.047354 
7 0 -3 -0.539166 
8 -3 0 -1.190831 
9 -1 -2 -1.329169 

[10 rows x 3 columns] 
+0

순서는 그룹 내에서 적용되거나 감소 함수로 전달되는 서브 프레임에 유지됩니다. 당신이하고있는 일과 왜 이것이 중요한지를 보여줘야합니다. – Jeff

+0

@Jeff x - x.shift (1)와 같은 적용 함수의 경우 중요합니다. 주문이 보존되지 않으면 잘못된 답을 얻을 수 있습니다. – lowtech

+0

답장을 보내 주셔서 감사합니다. @Andy Hayden 대답을 참조하십시오. – Jeff

답변

1

당신이뿐만 아니라 보장되지 순서이지만, 당신이 발견 한대로 같은 그룹에 대한 기능을 실행할 수있는 적용 사용하는 경우 몇 번 (어떤 "경로"를 취할 것인지/어떤 유형의 결과를 반환 할 것인지 결정할 때). 그래서 당신의 기능에 부작용이 있다면 이것을하지 마십시오!

간단히 groupby 개체를 반복하는 것이 좋습니다.

In [11]: df = pd.DataFrame([[1, 2], [1, 4], [5, 6]], columns=['A', 'B']) 

In [12]: df 
Out[12]: 
    A B 
0 1 2 
1 1 4 
2 5 6 

In [13]: g = df.groupby('A') 

In [14]: for key, sub_df in g: 
      print("key =", key) 
      print(sub_df) 
      print('') # apply whatever function you want 
key = 1 
    A B 
0 1 2 
1 1 4 

key = 5 
    A B 
2 5 6 

참고이 주문 (수준과 동일)이라고 g.grouper._get_group_keys()를 참조하십시오

그것은 기본적으로 분류되어있어
In [21]: g.grouper.levels 
Out[21]: [Int64Index([1, 5], dtype='int64')] 

합니다 (GROUPBY을 수행 할 때 정렬 kwarg있다), 그렇지 않은 통해 이것이 숫자 형 dtype이 아니라면 이것이 실제로 의미하는 바를 분명히하십시오.

+0

답장을 보내 주셔서 감사합니다. 그러나 제 질문은 다릅니다. 그룹 내 주문에 관심이 있습니다. 나는. 함수의 arg (이 예제에서는 show_x)의 데이터 프레임입니다. 행의 순서는 원본 데이터 프레임과 항상 같을 것입니다 (또는 그렇지 않을 수도 있습니다) – lowtech

+0

완벽하게 명확해야합니다 : pandas가 sub_df와 df를 보장 할 수 있습니다. * 항상 * 같은 순서의 공통 행을 가질 것인가? – lowtech