2015-05-27 2 views
8

मूल रूप से Select first row in each GROUP BY group? के समान ही पांडा में।पांडा: मैं समूह के प्रत्येक ग्रुप में पहली पंक्ति का चयन कैसे करूं?

df = pd.DataFrame({'A' : ['foo', 'foo', 'foo', 'foo', 'bar', 'bar', 'bar', 'bar'], 
       'B' : ['3', '1', '2', '4','2', '4', '1', '3'], 
        }) 

छंटाई होनहार लग रहा है:

df.sort('B') 

    A B 
1 foo 1 
6 bar 1 
2 foo 2 
4 bar 2 
0 foo 3 
7 bar 3 
3 foo 4 
5 bar 4 

लेकिन तब पहली वांछित परिणाम ... df.groupby ('ए') नहीं देंगे पहले()

 B 
A  
bar 2 
foo 3 

उत्तर

4

मैं एक और विकल्प प्रदान करना चाहते हैं:

df[ df.groupby('A')['B'].rank() == 1 ] 

    A B 
1 foo 1 
6 bar 1 

यहाँ एक संभावित लाभ यह है कि आप एक तरह से अनुक्रमित dataframe लौटने के लिए, ऐसे मामलों में जहां आपको लगता है कि चाहते हैं के लिए है।

इसके अलावा, मेरा मतलब यह नहीं है कि यह @ एडचम के उत्तर के प्रश्न या आलोचना के रूप में है, लेकिन यह मेरे लिए स्पष्ट नहीं है कि ग्रुपबी में जाने पर सॉर्ट ऑर्डर संरक्षित किया जाता है। शायद यह पांडा एपीआई के मुताबिक है, मैं सिर्फ ईमानदारी से नहीं जानता कि यह ऐसा कुछ है जिसे यहां पर गिना जा सकता है या नहीं, जबकि rank() विधि इस तरह अस्पष्ट नहीं है।

+1

सहमत है, मैं वही सोच रहा था। – ihadanny

+0

समस्या यह है कि 'df.sort ('B')' 'df की एक क्रमबद्ध * प्रति * लौटाता है, यह डीएफ को स्वयं नहीं बदलता है। यदि आप डीएफ को बदलना चाहते हैं, तो आपको निम्न में से कोई एक करने की आवश्यकता है: 'df = df.sort_values ​​('B')' 'या' df.sort_values ​​(inplace = True) ''। (पांडा अब '' sort'' के बजाय '' sort_values'' का उपयोग करता है।) – prooffreader

5

आम तौर पर यदि आप अपने डेटा को ग्रुपबी में सॉर्ट करना चाहते हैं, लेकिन यह कॉलम में से एक नहीं है जिसे समूहबद्ध किया जा रहा है तो sortgroupby प्रदर्शन करने से पहले डीएफ बेहतर है:

In [5]: 
df.sort('B').groupby('A').first() 

Out[5]: 
    B 
A  
bar 1 
foo 1 
+0

क्या सॉर्ट ऑर्डर को संरक्षित करने के लिए समूह को गिना जा सकता है? मैं ईमानदारी से नहीं जानता, मैं बस पूछ रहा हूँ। यह मेरे लिए स्पष्ट नहीं है कि यह होगा, हालांकि यह मामला बहुत अच्छा हो सकता है। – JohnE

+0

@ जोहान हां इसे चाहिए, अन्यथा आपको इसे फिर से सहारा लेना होगा जो दर्द होगा – EdChum

+0

हे, मैं @ जॉनई की विधि को पसंद कर रहा हूं क्योंकि यह क्लीनर और अधिक SQL-like है। शायद पांडा में आप किसी अन्य कॉलम (टाइम्सोर्ट?) द्वारा समूहबद्ध करने के बाद स्थिर होने के लिए सॉर्टिंग पर भरोसा कर सकते हैं लेकिन यह 'रैंक' सिंटैक्स – ihadanny

4

pandas groupby समारोह आप क्या चाहते हैं के लिए इस्तेमाल किया जा सकता है, लेकिन यह वास्तव में एकत्रीकरण के लिए है। यह एक आसान 'पहला ले लो' ऑपरेशन है।

आप वास्तव में क्या चाहते हैं pandas drop_duplicates फ़ंक्शन है, जो डिफ़ॉल्ट रूप से पहली पंक्ति लौटाएगा। आप आमतौर पर ग्रुपबी कुंजी पर विचार करेंगे, आपको सबसेट = वैरिएबल

df.drop_duplicates(subset='A') 

को जो करना चाहिए वह करना चाहिए।

इसके अलावा, df.sort('A') डेटाफ्रेम डीएफ को सॉर्ट नहीं करता है, यह एक प्रतिलिपि देता है जो सॉर्ट किया जाता है। यदि आप इसे सॉर्ट करना चाहते हैं, तो आपको inplace=True पैरामीटर जोड़ना होगा।

df.sort('A', inplace=True) 
+0

धन्यवाद @firelynx के रूप में स्पष्ट नहीं है, लेकिन मैं वास्तव में क्या देख रहा था 'df.sort (' बी ')। ग्रुपबी (' ए ')। पहला() ' – ihadanny

संबंधित मुद्दे