2011-09-28 13 views
9

मैं एक समूह के अनुसार डेटाफ्रेम की पंक्तियों को कम करने की कोशिश कर रहा हूं। यहाँ एक उदाहरण है। मैं निम्नलिखित डेटा को परिभाषित कहते हैं:पांडा का उपयोग करके, मैं समूह द्वारा एक बड़े डेटाफ्रेम को कुशल तरीके से कैसे कम कर सकता हूं?

from pandas import * 
df = DataFrame({'group1' : ["a","b","a","a","b","c","c","c","c", 
          "c","a","a","a","b","b","b","b"], 
       'group2' : [1,2,3,4,1,3,5,6,5,4,1,2,3,4,3,2,1], 
       'value' : ["apple","pear","orange","apple", 
          "banana","durian","lemon","lime", 
          "raspberry","durian","peach","nectarine", 
          "banana","lemon","guava","blackberry","grape"]}) 

अगर मैं समूह group1 और group2 द्वारा, फिर प्रत्येक समूह में पंक्तियों की संख्या यहाँ है:

In [190]: df.groupby(['group1','group2'])['value'].agg({'count':len}) 
Out[190]: 
     count 
a 1 2  
    2 1  
    3 2  
    4 1  
b 1 2  
    2 2  
    3 1  
    4 1  
c 3 1  
    4 1  
    5 2  
    6 1  

(अगर वहाँ के लिए एक और भी अधिक संक्षिप्त तरीके से है गणना करें, कृपया बताएं।)

अब मैं एक डेटाफ्रेम बनाना चाहता हूं जिसमें प्रत्येक समूह से एक यादृच्छिक रूप से चुनी गई पंक्ति हो। मेरा प्रस्ताव ऐसा करना है:

In [215]: from random import choice 
In [216]: grouped = df.groupby(['group1','group2']) 
In [217]: subsampled = grouped.apply(lambda x: df.reindex(index=[choice(range(len(x)))])) 
In [218]: subsampled.index = range(len(subsampled)) 
In [219]: subsampled 
Out[219]: 
    group1 group2 value 
0 b  2  pear 
1 a  1  apple 
2 b  2  pear 
3 a  1  apple 
4 a  1  apple 
5 a  1  apple 
6 a  1  apple 
7 a  1  apple 
8 a  1  apple 
9 a  1  apple 
10 a  1  apple 
11 a  1  apple 

जो काम करता है। हालांकि, मेरे वास्तविक डेटा में लगभग 2.5 मिलियन पंक्तियां और 12 कॉलम हैं। अगर मैं अपने स्वयं के डेटा संरचनाओं का निर्माण करके गंदे तरीके से ऐसा करता हूं, तो मैं इस ऑपरेशन को सेकंड के मामले में पूरा कर सकता हूं। हालांकि, उपरोक्त मेरा कार्यान्वयन 30 मिनट के भीतर समाप्त नहीं होता है (और यह स्मृति-सीमित प्रतीत नहीं होता है)। एक साइड नोट के रूप में, जब मैंने आर में इसे लागू करने का प्रयास किया, तो मैंने पहले plyr की कोशिश की, जो उचित समय में भी समाप्त नहीं हुआ; हालांकि, data.table का उपयोग कर एक समाधान बहुत तेजी से समाप्त हुआ।

pandas के साथ तेजी से काम करने के लिए मैं इसे कैसे प्राप्त करूं? मैं इस पैकेज को प्यार करना चाहता हूं, इसलिए कृपया मदद करें!

उत्तर

8

मैंने आवेदन के साथ परीक्षण किया, ऐसा लगता है कि जब कई उप समूह होते हैं, तो यह बहुत धीमा होता है।

subsampled = df.ix[(choice(x) for x in grouped.groups.itervalues())] 

संपादित करें: समूहों वर्गीकृत किया की विशेषता एक dict, तो आप विकल्प यह से सीधे सूचकांक कर सकते है पांडा संस्करण 0.18.1 के रूप में, itervalues नहीं रह गया है GroupBy वस्तुओं पर काम करता है - तुम सिर्फ .values उपयोग कर सकते हैं:

subsampled = df.ix[(choice(x) for x in grouped.groups.values())] 
+3

मैंने इस बारे में pystatsmodels मेलिंग सूची पर जवाब दिया। मैं आपके द्वारा सुझाए गए एक ही समाधान के साथ आया - पैकेज लेखक होने के नाते मुझे बेहतर तरीके से पता नहीं है =) –

+0

@ वेसम, मैं बस यहां आपके उत्तर को पार करने वाला था। सबको धन्यवाद! –

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