2013-08-01 2 views
18

मैं समूह समूह पर .size() का उपयोग कर रहा हूं ताकि यह गणना हो सके कि प्रत्येक समूह में कितनी चीज़ें हैं।किसी आकार() कॉलम में नाम कैसे असाइन करें?

मैं परिणाम को कॉलम नाम सरणी मैन्युअल रूप से संपादित किए बिना नए कॉलम नाम में सहेजना चाहता हूं, यह कैसे किया जा सकता है?

धन्यवाद

यह है कि मैं क्या करने की कोशिश की है:

grpd = df.groupby(['A','B']) 
grpd['size'] = grpd.size() 
grpd 

और त्रुटि मुझे मिल गया:

TypeError: 'DataFrameGroupBy' object does not support item assignment (on the second line)

+1

यह ध्यान देने योग्य है कि 'आकार'' कॉलम के लिए एक खराब विकल्प है, क्योंकि यह पांडा के तहत प्रत्येक वस्तु पर एक अंतर्निहित विधि है, इसलिए आप इसे 'getitem'' के माध्यम से पुनः प्राप्त कर सकते हैं, न कि' getattr'' के माध्यम से । – Meitham

उत्तर

12

df.groupby(...) का परिणाम एक DataFrame नहीं है। डेटाफ्रेम वापस पाने के लिए, आपको प्रत्येक समूह में एक फ़ंक्शन लागू करना होगा, समूह के प्रत्येक तत्व को बदलना होगा, या समूहों को फ़िल्टर करना होगा।

ऐसा लगता है कि आप एक डेटाफ्रेम चाहते हैं जिसमें (1) df और (2) में आपका सभी मूल डेटा प्रत्येक समूह में कितना डेटा है। इन चीजों की अलग-अलग लंबाई होती है, इसलिए यदि उन्हें एक ही डेटाफ्रेम में जाना है, तो आपको प्रत्येक समूह में प्रत्येक पंक्ति के लिए, आकार को अनावश्यक रूप से सूचीबद्ध करने की आवश्यकता होगी।

df['size'] = df.groupby(['A','B']).transform(np.size) 

(एक तरफ: यदि आप संक्षिप्त नमूना इनपुट और अपेक्षित परिणाम दिखाई देते हैं, तो यह उपयोगी है।)

+1

या, परिवर्तन! –

+0

मैंने यह भी पाया जो लगभग बराबर है (एक नया डेटाफ्रेम बनाता है), लेकिन यह सुनिश्चित नहीं है कि यह दक्षता के मामले में आपके समाधान के साथ तुलना कैसे करता है http://stackoverflow.com/questions/10373660/converting-a-pandas-groupby-object -to-dataframe – d1337

+0

आपके समाधान पर अधिक खिलौना उदाहरण पर अच्छा काम करता है, लेकिन वास्तविक डेटा पर एक त्रुटि लौटा दी जाती है http://pastebin.com/aCsMxCd5 – d1337

6

आप की जरूरत है transformsize-lendf के रूप में ही है से पहले:

import pandas as pd 

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y'] 
       , 'B': ['a', 'c', 'c','b','b']}) 
print (df) 
    A B 
0 x a 
1 x c 
2 x c 
3 y b 
4 y b 

df['size'] = df.groupby(['A', 'B'])['A'].transform('size') 
print (df) 
    A B size 
0 x a  1 
1 x c  2 
2 x c  2 
3 y b  2 
4 y b  2 

अगर जरूरत df - lendf में समान रूप से कॉलम नाम सेट करें रों से पहले:

import pandas as pd 

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y'] 
       , 'B': ['a', 'c', 'c','b','b']}) 
print (df) 
    A B 
0 x a 
1 x c 
2 x c 
3 y b 
4 y b 

df = df.groupby(['A', 'B']).size().reset_index(name='Size') 
print (df) 
    A B Size 
0 x a  1 
1 x c  2 
2 y b  2 
12

DataFrameGroupBy की .size() निर्मित विधि वास्तव में वस्तुओं समूह आकार और नहीं एक DataFrame के साथ एक श्रृंखला वस्तु देता है। यदि आप डेटाफ्रेम चाहते हैं जिसका स्तंभ समूह आकार है, समूह द्वारा अनुक्रमित, कस्टम नाम के साथ, आप .to_frame() विधि का उपयोग कर सकते हैं और वांछित कॉलम नाम का उपयोग इसके तर्क के रूप में कर सकते हैं।

grpd = df.groupby(['A','B']).size().to_frame('size') 

आप समूहों कॉलम फिर आप अंत में एक .reset_index() जोड़ सकते हैं बनना चाहता था तो।

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