2013-02-25 37 views
16

dataframe लिएप्राप्त समूह आईडी वापस पांडा dataframe में

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 [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 

लेकिन मैं में एक क्षेत्र प्राप्त करना चाहते हैं हो रही है मूल df कि उस पंक्ति के लिए समूह संख्या में शामिल हैं, की तरह

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 

वहाँ है पांडा में ऐसा करने का एक अच्छा तरीका है?

मैं, अजगर के साथ इसे प्राप्त कर सकते हैं

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

तीन साल बाद और यह बात अभी भी अनियंत्रित है। लेकिन यह पता लगाना आसान है कि 'df.grouper' वर्ग' बेसग्राउपर 'है। 'Group_info' विधि कोड में परिभाषित किया गया है [यहां] (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