2013-02-25 2 views
16

나는 이름과 순위에 의해 그룹화에 관심이 아마도 집계 값가져 오기 그룹 ID 다시 팬더 dataframe에 dataframe를 들어

In [3]: group = df.groupby(['Name', 'Rank']) 
In [4]: agg = group.agg(sum) 
In [5]: agg 
Out[5]: 
       Val 
Name Rank   
bar 0  1.839091 
    2  0.381515 
foo 0  0.817097 
    1  0.209324 

하지만에서 필드를 좀하고 싶습니다납니다

In [2]: df = pd.DataFrame({'Name': ['foo', 'bar'] * 3, 
    ...:     'Rank': np.random.randint(0,3,6), 
    ...:     'Val': np.random.rand(6)}) 
    ...: df 
Out[2]: 
    Name Rank  Val 
0 foo  0 0.299397 
1 bar  0 0.909228 
2 foo  0 0.517700 
3 bar  0 0.929863 
4 foo  1 0.209324 
5 bar  2 0.381515 

In [13]: df['Group_id'] = [2, 0, 2, 0, 3, 1] 
In [14]: df 
Out[14]: 
    Name Rank  Val Group_id 
0 foo  0 0.299397   2 
1 bar  0 0.909228   0 
2 foo  0 0.517700   2 
3 bar  0 0.929863   0 
4 foo  1 0.209324   3 
5 bar  2 0.381515   1 

등의 해당 행에 대한 그룹 번호가 들어있는 원래 df는 THER인가 팬더에서 이렇게 좋은 방법?

나는, 파이썬과

In [16]: from itertools import count 
In [17]: c = count() 
In [22]: group.transform(lambda x: c.next()) 
Out[22]: 
    Val 
0 2 
1 0 
2 2 
3 0 
4 3 
5 1 

그것을 얻을 수 있지만 큰 dataframe에 꽤 느린, 그래서 나는이 작업을 수행 할 수있는 더 좋은 내장 팬더의 방법이 될 수있다 생각.

답변

25

많은 유용한 것들이 DataFrameGroupBy.grouper 개체에 저장됩니다.

>>> df = pd.DataFrame({'Name': ['foo', 'bar'] * 3, 
        'Rank': np.random.randint(0,3,6), 
        'Val': np.random.rand(6)}) 
>>> grouped = df.groupby(["Name", "Rank"]) 
>>> grouped.grouper. 
grouped.grouper.agg_series  grouped.grouper.indices 
grouped.grouper.aggregate   grouped.grouper.labels 
grouped.grouper.apply    grouped.grouper.levels 
grouped.grouper.axis    grouped.grouper.names 
grouped.grouper.compressed  grouped.grouper.ngroups 
grouped.grouper.get_group_levels grouped.grouper.nkeys 
grouped.grouper.get_iterator  grouped.grouper.result_index 
grouped.grouper.group_info  grouped.grouper.shape 
grouped.grouper.group_keys  grouped.grouper.size 
grouped.grouper.groupings   grouped.grouper.sort 
grouped.grouper.groups    

등 : 예를 들어

>>> df["GroupId"] = df.groupby(["Name", "Rank"]).grouper.group_info[0] 
>>> df 
    Name Rank  Val GroupId 
0 foo  0 0.302482  2 
1 bar  0 0.375193  0 
2 foo  2 0.965763  4 
3 bar  2 0.166417  1 
4 foo  1 0.495124  3 
5 bar  2 0.728776  1 

grouper.group_info[0] 주변에 어딘가에 숨어위한 더 좋은 별명이있을 수 있지만, 어쨌든 작동합니다.

+1

또 다른 별칭은'grouped.grouper.labels [0] ' – beardc

+2

인 것 같습니다. 그루퍼는 문서화되지 않았으므로 깨지지 않을 것입니다. – dashesy

+0

3 년 후이 문제는 여전히 문서화되지 않았습니다. 그러나'df.grouper'는'BaseGrouper' 클래스를 가지고 있다는 것을 쉽게 알 수 있습니다. 'group_info' 메쏘드는 코드에서 [here] (https://github.com/pydata/pandas/blob/2e4da9b07d500add644257b9fa317a668cf5e332/pandas/core/groupby.py#L1549)로 정의되어 있으며, 약간의 흔적을 따라갈 수 있습니다 1)'group_info [1]'은 유일한 그룹 식별자의 배열이고, 2) 행'i'에 대한 그룹 식별자는'group_info [0] [i]'이고, 3)'group_info [3] ]'그룹의 수입니다. – shadowtalker