2013-02-21 35 views
23

मेरे पास डेटा फ्रेम है और मैं इसे किसी विशेष कॉलम द्वारा समूहित करना चाहता हूं (या, दूसरे शब्दों में, किसी विशेष कॉलम से मानों के अनुसार)। मैं इसे निम्न तरीके से कर सकता हूं: grouped = df.groupby(['ColumnName'])पांडा में समूह का उपयोग करते समय कॉलम में "पहला" और "आखिरी" फ़ंक्शंस कैसे लागू करें?

मैं इस ऑपरेशन के परिणाम को एक तालिका के रूप में कल्पना करता हूं जिसमें कुछ कक्षों में एकल मानों के बजाय मूल्यों के सेट हो सकते हैं। एक सामान्य तालिका प्राप्त करने के लिए (यानी एक सारणी जिसमें प्रत्येक कक्ष में केवल एक ही मान होता है) मुझे यह इंगित करने की आवश्यकता है कि मैं कौन से फ़ंक्शन का उपयोग करना चाहता हूं ताकि कोशिकाओं में मानों के सेट को एकल मानों में परिवर्तित किया जा सके।

उदाहरण के लिए मैं मूल्यों के सेट को उनके योग, या उनके न्यूनतम या अधिकतम मूल्य से प्रतिस्थापित कर सकता हूं। मैं इसे निम्न तरीके से कर सकता हूं: grouped.sum() या grouped.min() और इसी तरह।

अब मैं विभिन्न कॉलम के लिए विभिन्न कार्यों का उपयोग करना चाहता हूं। मुझे पता चला कि मैं इसे निम्न तरीके से कर सकता हूं: grouped.agg({'ColumnName1':sum, 'ColumnName2':min})

हालांकि, कुछ कारणों से मैं first का उपयोग नहीं कर सकता। अधिक जानकारी में, grouped.first() काम करता है, लेकिन grouped.agg({'ColumnName1':first, 'ColumnName2':first}) काम नहीं करता है। नतीजतन मुझे एक नाम त्रुटि मिलती है: NameError: name 'first' is not defined। तो, मेरा सवाल है: ऐसा क्यों होता है और इस समस्या को कैसे हल किया जाए।

जोड़ा

Here मैं निम्न उदाहरण पाया:

grouped['D'].agg({'result1' : np.sum, 'result2' : np.mean}) 

हो सकता है मैं भी np उपयोग करने की आवश्यकता? लेकिन मेरे मामले में अजगर "एनपी" पहचान नहीं है। क्या मुझे इसे आयात करना चाहिए?

+0

आपको 'np' की आवश्यकता नहीं है, यह सादे पुराने' sum' (केवल कम कुशलतापूर्वक) के साथ काम करेगा। numpy pandas के साथ आयात किया जाता है (यदि आप 'pdas के रूप में pandas आयात करते हैं तो यह' pd.np' है) लेकिन अधिकांश लोग सुविधा के लिए इसे अलग से आयात भी करेंगे। –

उत्तर

23

मुझे लगता है कि मुद्दा यह है कि दो अलग-अलग first विधियां हैं जो नाम साझा करती हैं लेकिन अलग-अलग कार्य करती हैं, एक groupby objects और another for a Series/DataFrame (टाइम्सरीज़ के साथ करने के लिए) है।

grouped.agg(lambda x: x.iloc[0]) 

उदाहरण के लिए:

एक DataFrame agg का उपयोग कर आप iloc[0] (जो प्रत्येक समूह में पहली पंक्ति हो जाता है (DataFrame/सीरीज) सूचकांक द्वारा) इस्तेमाल कर सकते हैं अधिक GroupBy first विधि के व्यवहार को दोहराने के लिए:

In [1]: df = pd.DataFrame([[1, 2], [3, 4]]) 

In [2]: g = df.groupby(0) 

In [3]: g.first() 
Out[3]: 
    1 
0 
1 2 
3 4 

In [4]: g.agg(lambda x: x.iloc[0]) 
Out[4]: 
    1 
0 
1 2 
3 4 

Analogously आप iloc[-1] का उपयोग कर last को दोहराने कर सकते हैं।

नोट: यह इच्छा स्तंभ-वार, एट अल काम करता है:

g.agg({1: lambda x: x.iloc[0]}) 

पांडा आप irow विधि का प्रयोग करेंगे सकता है (x.irow(0) जैसे के पुराने संस्करण में, पिछले संपादन देख


कुछ अद्यतन नोट्स:

यहका उपयोग करके बेहतर किया जाता हैGroupBy विधि है, जो बहुत तेजी से है> = 0.13:

g.nth(0) # first 
g.nth(-1) # last 

आप ... first के लिए देखभाल एक छोटे से लेने के लिए, डिफ़ॉल्ट व्यवहार के रूप और last NaN पंक्तियों पर ध्यान नहीं देता है और DataFrame के लिए IIRC groupbys यह टूट गया था प्री-0.13 ... nth के लिए dropna विकल्प है।

आप तार के बजाय बनाया-इन का उपयोग कर सकते हैं (हालांकि IIRC पांडा धब्बे यह sum निर्मित है और np.sum लागू होता है):

grouped['D'].agg({'result1' : "sum", 'result2' : "mean"}) 
+0

बस [यदि दस्तावेज़] (http://pandas.pydata.org/pandas-docs/dev/indexing.html के अनुसार) किसी के लिए उपयोगी है), 'irow' अब बहिष्कृत है ('x.iloc [0]' चाल की बजाय चाल है) – cd98

+0

@ cd98 यह इंगित करने के लिए धन्यवाद, मैंने इसे नए वाक्यविन्यास के साथ अपडेट किया है :) –

+0

मैं उलझन में हूं [ डॉक्स] (http://pandas.pydata.org/pandas-docs/stable/groupby.html#aggregation); यह बताता है: 'समेकित कार्य वे हैं जो लौटाई गई वस्तुओं के आयाम को कम करते हैं, उदाहरण के लिए: माध्य, योग, आकार, गिनती, std, var, sem, description, first, last, nth, min, max.' तो क्या हैं वे किसके बारे में बात कर रहे हैं? – Tjorriemorrie

0

मुझे यकीन है कि अगर यह वास्तव में मुद्दा है, लेकिन sum और min, पायथन निर्मित इन है कि इनपुट के रूप में कुछ iterables ले जबकि first पांडा सीरीज वस्तु की एक विधि है नहीं कर रहा हूँ, तो शायद यह अपने नाम स्थान में नहीं है। इसके अलावा यह इनपुट के रूप में कुछ और लेता है (डॉक्टर कुछ ऑफसेट मान कहता है)।

मैं एक तरह से लगता है कि प्राप्त करने के लिए चारों ओर, अपने खुद के first समारोह बनाते हैं, और बताएं कि वह ऐसी है कि वह एक इनपुट के रूप में एक सीरीज वस्तु लेता है जैसे:

def first(Series, offset): 
    return Series.first(offset) 

या ऐसा ही कुछ ..

+0

यह एक दयालुता है 'pd.Series.first' काम नहीं करता – Tjorriemorrie

6
इसके बजाय first या last का उपयोग कर के, agg में अपने स्ट्रिंग निरूपण का उपयोग

तरीका। उदाहरण के लिए ओपी के मामले पर:

grouped = df.groupby(['ColumnName']) 
grouped['D'].agg({'result1' : np.sum, 'result2' : np.mean}) 

#you can do the string representation for first and last 
grouped['D'].agg({'result1' : 'first', 'result2' : 'last'})