2013-07-17 20 views
27

में value_counts का कॉलम बनाना चाहता हूं, मैं आर से अधिक परिचित हूं लेकिन मैं देखना चाहता हूं कि पांडा में ऐसा करने का कोई तरीका है या नहीं। मैं अपने डेटाफ्रेम कॉलम में से एक से अद्वितीय मानों की गिनती बनाना चाहता हूं और फिर उन मूल गणनाओं के साथ एक नया कॉलम जोड़ना चाहता हूं जो मेरे मूल डेटा फ्रेम में है। मैंने दो अलग-अलग चीजों की कोशिश की है। मैंने एक पांडा श्रृंखला बनाई और फिर value_counts विधि के साथ गणना की गणना की। मैंने इन मानों को वापस अपने मूल डेटाफ्रेम में मर्ज करने का प्रयास किया, लेकिन मैं जिस कुंजी को विलय करना चाहता हूं वह इंडेक्स (ix/loc) में है। कोई सुझाव या समाधानमैं अपने पांडा डेटाफ्रेम

Color Value 
Red 100 
Red 150 
Blue 50 

सराहना की होगी और मैं की तरह

Color Value Counts 
Red 100 2 
Red 150 2 
Blue 50 1 
+1

यह हाल ही में लोकप्रिय प्रश्न है। यह प्रश्न देखें [यहां] (http://stackoverflow.com/questions/17666075/python-pandas-groupby-result/17666287#17666287) जो आपकी स्थिति के लगभग समान है। – bdiamante

उत्तर

37
df['Counts'] = df.groupby(['Color'])['Value'].transform('count') 

उदाहरण के लिए कुछ वापस जाने के लिए,

In [102]: df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}) 

In [103]: df 
Out[103]: 
    Color Value 
0 Red 100 
1 Red 150 
2 Blue  50 

In [104]: df['Counts'] = df.groupby(['Color'])['Value'].transform('count') 

In [105]: df 
Out[105]: 
    Color Value Counts 
0 Red 100  2 
1 Red 150  2 
2 Blue  50  1 

ध्यान दें कि transform('count') पर ध्यान नहीं देता Nans चाहता था। यदि आप NaNs को गिनना चाहते हैं, तो transform(len) का उपयोग करें।


गुमनाम संपादक करने के लिए: आप पांडा बहुत पुराना होने के अपने संस्करण के कारण जबकि transform('count') का उपयोग कर यह हो सकता है एक त्रुटि मिल रहे हैं। उपरोक्त काम पांडा संस्करण 0.15 या नए के साथ काम करता है।

+0

बहुत बहुत धन्यवाद। बहुत उपयोगी। मैं इसे एक बड़े डेटाफ्रेम पर लागू करने की कोशिश कर रहा हूं और यह त्रुटि प्राप्त करना जारी रखता हूं "ValueError: गलत संख्या में आइटम पास हुए, सूचकांक 4 का संकेत देते हैं"। – user2592989

+2

यानी df.groupby (['रंग']) [] बदलने के लिए केवल एक कॉलम चुनने का प्रयास करें .transform ('count') – user1827356

+0

कुकबुक में जोड़ा गया: http://pandas.pydata.org/pandas-docs/dev /cookbook.html#grouping (दस्तावेज़ कल निर्माण करेंगे) – Jeff

2

मेरे प्रारंभिक विचार के रूप में नीचे दिखाया गया है लेकिन, के रूप में टिप्पणी में बताया गया सूची समझ का उपयोग किया जाएगा, इस groupby और transform विधि की तुलना में धीमी है। मैं क्या नहीं करने के लिए प्रदर्शित करने के लिए इस उत्तर छोड़ देंगे:

In [94]: df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}) 
In [95]: df['Counts'] = [sum(df['Color'] == df['Color'][i]) for i in xrange(len(df))] 
In [96]: df 
Out[100]: 
    Color Value Counts 
0 Red 100  2 
1 Red 150  2 
2 Blue  50  1 

[3 rows x 3 columns] 

@ unutbu की विधि कई स्तंभ जो कोड को यह आसान बनाने के साथ DataFrames के लिए जटिल हो जाता है। यदि आप एक छोटे डेटा फ्रेम के साथ काम कर रहे हैं, तो यह तेज़ है (नीचे देखें), लेकिन अन्यथा, आपको का उपयोग करना चाहिए।

In [97]: %timeit df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}); df['Counts'] = df.groupby(['Color']).transform('count') 
100 loops, best of 3: 2.87 ms per loop 
In [98]: %timeit df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}); df['Counts'] = [sum(df['Color'] == df['Color'][i]) for i in xrange(len(df))] 
1000 loops, best of 3: 1.03 ms per loop 
+3

3 पंक्तियों के साथ उदाहरण समय के साथ बहुत भ्रामक है। इसे एक बड़े डेटाफ्रेम के साथ आज़माएं, और आप देखेंगे कि ग्रुपबी दृष्टिकोण * बहुत * तेज़ है (मैंने इसे आपके 'डीएफ' के साथ 1000 बार दोहराया ('df = pd.concat ([df] * 1000, ignore_index = True) ') और 3.6 एमएस (ग्रोपबी) बनाम 2 9 एस (सूची समझ) प्राप्त करें)। इसके अलावा, मुझे लगता है कि समूह दृष्टिकोण दृष्टिकोण सरल है। – joris

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