2014-11-03 16 views
10

में उपसमूहों में पंक्तियों को रैंक करने का तेज़ तरीका मेरे पास एक पांडा डेटा फ्रेम है जो विभिन्न उपसमूहों से बना है।पांडा डेटाफ्रेम

df = pd.DataFrame({ 
    'id':[1, 2, 3, 4, 5, 6, 7, 8], 
    'group':['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'], 
    'value':[.01, .4, .2, .3, .11, .21, .4, .01] 
    }) 

मैं अपने समूह में प्रत्येक आईडी का रैंक ढूंढना चाहता हूं, कम मूल्य बेहतर है। उपर्युक्त उदाहरण में, समूह ए में, आईडी 1 में 1 रैंक होगा, आईडी 2 का रैंक 4 होगा। समूह बी में, आईडी 5 में 2 रैंक होगा, आईडी 8 के पास रैंक 1 होगा और इसलिए पर। मान के अनुसार सॉर्ट

  1. :

    अभी मैं द्वारा रैंक का आकलन।

    df.sort('value', ascending = True, inplace=True)

  2. एक स्थान रखनेवाला समारोह बनाएं

    def ranker(df): df['rank'] = np.arange(len(df)) + 1 return df

  3. (यह पहले से ही हल कर चर मान लिया गया है) अलग से प्रत्येक समूह पर स्थान रखनेवाला समारोह लागू करें:

    df = df.groupby(['group']).apply(ranker)

012,

यह प्रक्रिया काम करती है लेकिन जब मैं इसे डेटा की लाखों पंक्तियों पर चलाता हूं तो यह वास्तव में धीमा होता है। क्या किसी के पास कोई तेज़ रैंकर फ़ंक्शन बनाने के बारे में कोई विचार है।

उत्तर

19

रैंक साइथोनिज्ड है इसलिए बहुत तेज़ होना चाहिए। और आप df.rank() hererank के लिए दस्तावेज़ हैं जैसे ही विकल्प पास कर सकते हैं। जैसा कि आप देख सकते हैं, method तर्क के माध्यम से पांच अलग-अलग तरीकों में से एक में टाई-ब्रेक किया जा सकता है।

यह भी संभव है कि आप समूह के .cumcount() चाहते हैं।

In [12]: df.groupby('group')['value'].rank(ascending=False) 
Out[12]: 
0 4 
1 1 
2 3 
3 2 
4 3 
5 2 
6 1 
7 4 
dtype: float64 
+0

बेशक! इसके लिए एक समारोह है! उस ने कहा, यह मेरे कार्य के ऊपर जैसा ही नहीं है क्योंकि यदि मानों में कोई टाई है, तो मेरा फ़ंक्शन यादृच्छिक रूप से एक आईडी को एक ही आईडी के साथ एक और आईडी के मुकाबले उच्च रैंक देगा। यद्यपि .rank() के समान मानों को संभालने का तरीका समझदार है, मेरे उद्देश्यों के लिए, मुझे अपने फ़ंक्शन द्वारा उत्पादित आउटपुट की आवश्यकता है। आपकी सहायताके लिए धन्यवाद! –

+0

मैंने एक विकल्प के साथ अद्यतन किया। – Jeff

9

एक बड़ा DataFrame (13 लाख लाइनों) के साथ कार्य करना, GroupBy साथ विधि रैंक बाहर maxed RAM की मेरी 8GB एक यह एक बहुत लंबा समय लगा। मुझे याद में एक लालसा कम लालसा मिला, मैंने यहां बस मामले में रखा:

df.sort_values('value') 
tmp = df.groupby('group').size() 
rank = tmp.map(range) 
rank =[item for sublist in rank for item in sublist] 
df['rank'] = rank 
संबंधित मुद्दे