2013-07-01 4 views
2

그룹 번호가있는 배열을 만드는 효율적인 팬 패널 방식을 찾고 있습니다 (원래 데이터 프레임의 모든 행에 대해이 행이 어느 그룹에 속해 있는지 알려주는 숫자가 필요함).) :팬더 : 그룹 인덱스를 사용하여 배열 만들기

In : df 
Out]: 
    a b 
0 1 1 
1 1 2 
2 1 1 
3 2 1 
4 2 2 
5 2 1  

In : groups.indices 
Out: 
{(1, 1): array([0, 2]), 
(1, 2): array([1]), 
(2, 1): array([3, 5]), 
(2, 2): array([4])} 

In : group_indices 
Out: array([0, 1, 0, 2, 3, 2]) 

내 문제가 df 주위 20000x100 (64 비트 수레이다)과 열 두 가지로 I 그룹의 경우, 내가 6기가바이트 위의 메모리 사용량을 얻을 수 있다는 것입니다

df = pandas.DataFrame({'a': [1, 1, 1, 2, 2, 2], 'b': [1, 2, 1, 1, 2, 1]}) 
groups = df.groupby(['a', 'b']) 
group_names = sorted(groups.groups.keys()) 
group_indices = np.array(df.index) 
for index, group in enumerate(group_names): 
    group_indices[groups.indices[group]] = index 

. 어느 쪽이 더 기대되는 것보다 길이다.

답변

5

부호를 각각 이미 이들과 같은

In [52]: groups.grouper.levels 
Out[52]: [Int64Index([1, 2], dtype=int64), Int64Index([1, 2], dtype=int64)] 

In [53]: groups.grouper.labels 
Out[53]: [array([0, 0, 0, 1, 1, 1]), array([0, 1, 0, 0, 1, 0])] 

In [57]: l = groups.grouper.labels 

In [58]: zip(*l) 
Out[58]: [(0, 0), (0, 1), (0, 0), (1, 0), (1, 1), (1, 0)] 

In [18]: groups.grouper.group_info 
Out[18]: (array([0, 1, 0, 2, 3, 2]), array([0, 1, 2, 3]), 4) 

간단한 조회 작업이 이미 그룹화 개체 이것은 또한 매우 잘 작동

In [19]: groups.grouper.group_info[0] 
Out[19]: array([0, 1, 0, 2, 3, 2]) 
+0

에 계산 된 GROUPBY 객체에 포함, 그것은 분명하지만 깨끗하고 있습니다 나는 그룹 객체에 대한 문서를 찾는 데 어려움을 겪고 있기 때문에 더 마술 적이라고 생각합니다. 'groups.grouper.result_index.tolist()'를 사용하여 올바른 레이블을 찾을 수도 있습니다. 감사! –

+0

당신은 왜 정보를 가지고 있는지 설명하지 않았는데, groupby가 그 작업에서 부기를 관리하기 때문에 일반적으로 정보가 필요하지 않습니다. 너 뭐하려고? – Jeff

+0

'grouper'에 대해 언급 해 주셔서 감사합니다. 문서화되지 않았기 때문에! 마지막으로 grouped.grouper.indices를 사용하여 그룹화 된 객체를 반복하면서 원래 데이터 프레임의 행을 변경하는 솔루션을 발견했습니다. 데이터 프레임에 중복 DateTime 인덱스가 있기 때문에 그것을 사용해야했습니다. 또한 변환은 너무 복잡하여 '적용'패러다임에 맞지 않습니다. 클러스터링과 각 그룹을 거치면서 동시에 여러 데이터 프레임을 채우는 작업이 포함됩니다. – dashesy