पांडा समूह का उपयोग करके प्रत्येक समूह (जैसे गिनती, माध्य, आदि) के लिए आंकड़े प्राप्त करें?


438

मेरे पास एक डेटा फ़्रेम है dfऔर मैं इसमें से कई कॉलम का उपयोग करता हूं groupby:

df['col1','col2','col3','col4'].groupby(['col1','col2']).mean()

उपरोक्त तरीके से मुझे लगभग तालिका (डेटा फ़्रेम) मिलती है जिसकी मुझे आवश्यकता है। क्या गायब है एक अतिरिक्त स्तंभ है जिसमें प्रत्येक समूह में पंक्तियों की संख्या होती है। दूसरे शब्दों में, मेरा मतलब है लेकिन मैं यह भी जानना चाहूंगा कि इन साधनों को प्राप्त करने के लिए कितनी संख्या का उपयोग किया गया था। पहले समूह में उदाहरण के लिए 8 मान हैं और दूसरे में 10 और इतने पर।

संक्षेप में: डेटाफ़्रेम के लिए मुझे समूह-वार आँकड़े कैसे प्राप्त होंगे ?

जवाबों:


427

पर groupbyवस्तु, aggकार्य करने के लिए एक सूची ले जा सकते हैं कई एकत्रीकरण विधियां लागू एक ही बार में। यह आपको वह परिणाम देना चाहिए जिसकी आपको आवश्यकता है:

df[['col1', 'col2', 'col3', 'col4']].groupby(['col1', 'col2']).agg(['mean', 'count'])

2
मुझे लगता है कि आपको एक सूची होने के लिए कॉलम संदर्भ की आवश्यकता है। क्या आप शायद मतलब है: df[['col1','col2','col3','col4']].groupby(['col1','col2']).agg(['mean', 'count'])
rysqui

43
यह चार गणना कॉलम बनाता है, लेकिन केवल एक कैसे प्राप्त करें? (सवाल "एक अतिरिक्त कॉलम" के लिए पूछता है और यही मैं भी चाहूंगा।)
जान

16
कृपया मेरा उत्तर देखें यदि आप countप्रति समूह केवल एक कॉलम प्राप्त करना चाहते हैं ।
पेड्रो एम डुटर्टे

क्या होगा यदि मेरे पास अलग-अलग गणनाएं हैं और बजाय समूहीकृत प्रकार की पंक्तियों को गिनने के लिए, मुझे कॉलम गणनाओं के साथ जोड़ना होगा।
अभिषेक भाटिया

@ जान result = df['col1','col2','col3','col4'].groupby(['col1', 'col2']).mean() ; counts = times.groupby(['col1', 'col2']).size() ; result['count'] = counts
अलवितावा

910

शीघ्र जवाब:

प्रति समूह पंक्ति गणना प्राप्त करने का सबसे सरल तरीका कॉलिंग है .size(), जो एक रिटर्न देता है Series:

df.groupby(['col1','col2']).size()


आमतौर पर आप इस परिणाम को एक DataFrame(के बजाय Series) चाहते हैं ताकि आप कर सकें:

df.groupby(['col1', 'col2']).size().reset_index(name='counts')


यदि आप यह जानना चाहते हैं कि पंक्ति की गणना कैसे करें और प्रत्येक समूह के लिए अन्य आँकड़े नीचे पढ़ना जारी रखें।


विस्तृत उदाहरण:

निम्नलिखित उदाहरण पर विचार करें डेटाफ़्रेम:

In [2]: df
Out[2]: 
  col1 col2  col3  col4  col5  col6
0    A    B  0.20 -0.61 -0.49  1.49
1    A    B -1.53 -1.01 -0.39  1.82
2    A    B -0.44  0.27  0.72  0.11
3    A    B  0.28 -1.32  0.38  0.18
4    C    D  0.12  0.59  0.81  0.66
5    C    D -0.13 -1.65 -1.64  0.50
6    C    D -1.42 -0.11 -0.18 -0.44
7    E    F -0.00  1.42 -0.26  1.17
8    E    F  0.91 -0.47  1.35 -0.34
9    G    H  1.48 -0.63 -1.14  0.17

पहले चलो .size()पंक्ति मायने रखता है का उपयोग करें:

In [3]: df.groupby(['col1', 'col2']).size()
Out[3]: 
col1  col2
A     B       4
C     D       3
E     F       2
G     H       1
dtype: int64

तो चलो .size().reset_index(name='counts')पंक्ति मायने रखता है का उपयोग करने के लिए:

In [4]: df.groupby(['col1', 'col2']).size().reset_index(name='counts')
Out[4]: 
  col1 col2  counts
0    A    B       4
1    C    D       3
2    E    F       2
3    G    H       1


अधिक आँकड़ों के लिए परिणाम शामिल हैं

जब आप समूहीकृत डेटा पर आँकड़ों की गणना करना चाहते हैं, तो यह आमतौर पर इस तरह दिखता है:

In [5]: (df
   ...: .groupby(['col1', 'col2'])
   ...: .agg({
   ...:     'col3': ['mean', 'count'], 
   ...:     'col4': ['median', 'min', 'count']
   ...: }))
Out[5]: 
            col4                  col3      
          median   min count      mean count
col1 col2                                   
A    B    -0.810 -1.32     4 -0.372500     4
C    D    -0.110 -1.65     3 -0.476667     3
E    F     0.475 -0.47     2  0.455000     2
G    H    -0.630 -0.63     1  1.480000     1

उपरोक्त परिणाम नेस्टेड कॉलम लेबल के कारण से निपटने के लिए थोड़ा कष्टप्रद है, और यह भी क्योंकि पंक्ति गणना प्रति स्तंभ आधार पर होती है।

आउटपुट पर अधिक नियंत्रण प्राप्त करने के लिए मैं आमतौर पर आँकड़ों को अलग-अलग एकत्रीकरण में विभाजित करता हूँ जिन्हें मैं फिर उपयोग करके संयोजित करता हूँ join। यह इस तरह दिख रहा है:

In [6]: gb = df.groupby(['col1', 'col2'])
   ...: counts = gb.size().to_frame(name='counts')
   ...: (counts
   ...:  .join(gb.agg({'col3': 'mean'}).rename(columns={'col3': 'col3_mean'}))
   ...:  .join(gb.agg({'col4': 'median'}).rename(columns={'col4': 'col4_median'}))
   ...:  .join(gb.agg({'col4': 'min'}).rename(columns={'col4': 'col4_min'}))
   ...:  .reset_index()
   ...: )
   ...: 
Out[6]: 
  col1 col2  counts  col3_mean  col4_median  col4_min
0    A    B       4  -0.372500       -0.810     -1.32
1    C    D       3  -0.476667       -0.110     -1.65
2    E    F       2   0.455000        0.475     -0.47
3    G    H       1   1.480000       -0.630     -0.63



फुटनोट

परीक्षण डेटा उत्पन्न करने के लिए उपयोग किया जाने वाला कोड नीचे दिखाया गया है:

In [1]: import numpy as np
   ...: import pandas as pd 
   ...: 
   ...: keys = np.array([
   ...:         ['A', 'B'],
   ...:         ['A', 'B'],
   ...:         ['A', 'B'],
   ...:         ['A', 'B'],
   ...:         ['C', 'D'],
   ...:         ['C', 'D'],
   ...:         ['C', 'D'],
   ...:         ['E', 'F'],
   ...:         ['E', 'F'],
   ...:         ['G', 'H'] 
   ...:         ])
   ...: 
   ...: df = pd.DataFrame(
   ...:     np.hstack([keys,np.random.randn(10,4).round(2)]), 
   ...:     columns = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6']
   ...: )
   ...: 
   ...: df[['col3', 'col4', 'col5', 'col6']] = \
   ...:     df[['col3', 'col4', 'col5', 'col6']].astype(float)
   ...: 


अस्वीकरण:

यदि आपके द्वारा एकत्र किए जा रहे कुछ स्तंभों में अशक्त मान हैं, तो आप वास्तव में प्रत्येक स्तंभ के लिए एक स्वतंत्र एकत्रीकरण के रूप में समूह पंक्ति गणनाओं को देखना चाहते हैं। अन्यथा आपको इस बात से गुमराह किया जा सकता है कि वास्तव में इस तरह की चीजों की गणना करने के लिए कितने रिकॉर्ड का उपयोग किया जा रहा है क्योंकि पांडा इस NaNबारे में आपको बताए बिना मतलब गणना में प्रविष्टियां छोड़ देंगे ।


1
अरे, मैं वास्तव में आपके समाधान को पसंद करता हूं, विशेष रूप से आखिरी, जहां आप विधि का उपयोग करते हैं। हालाँकि, चूंकि यह अक्सर आवश्यक होता है, इसलिए अलग-अलग कॉलम के लिए अलग-अलग एकत्रीकरण कार्यों को लागू करने के लिए, pd.concat का उपयोग करके परिणामी डेटा फ़्रेमों को भी सम्मिलित किया जा सकता है। यह शायद आसान उपसमुच्चय की तुलना में पढ़ने के लिए आसान है
Quickbeam2k1

4
अच्छा समाधान, लेकिन इसके लिए In [5]: counts_df = pd.DataFrame(df.groupby('col1').size().rename('counts')), हो सकता है कि नए कॉलम के रूप में आकार () को सेट करना बेहतर हो, यदि आप आगे के विश्लेषण के लिए डेटाफ्रेम में हेरफेर करना चाहते हैं, जो होना चाहिएcounts_df = pd.DataFrame(df.groupby('col1').size().reset_index(name='counts')
लैंसलोटहोल

2
"अधिक आँकड़ों के लिए परिणाम शामिल करने के लिए धन्यवाद" बिट! चूंकि मेरी अगली खोज कॉलम पर परिणामी मल्टींडेक्स को समतल करने के बारे में थी, इसलिए मैं यहां उत्तर के लिए लिंक करूंगा: stackoverflow.com/a/50558529/1026
निकोले

महान! क्या आप मुझे एक संकेत दे सकते हैं कि isnullइस क्वेरी को एक कॉलम में कैसे जोड़ा जाए? 'col4': ['median', 'min', 'count', 'isnull']
पीटर

38

एक नियम सभी उन्हें नियम: GroupBy.describe

रिटर्न count, mean, std, और अन्य उपयोगी आंकड़ों के अनुसार समूह।

df.groupby(['col1', 'col2'])['col3', 'col4'].describe()

# Setup
np.random.seed(0)
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                          'foo', 'bar', 'foo', 'foo'],
                   'B' : ['one', 'one', 'two', 'three',
                          'two', 'two', 'one', 'three'],
                   'C' : np.random.randn(8),
                   'D' : np.random.randn(8)})

from IPython.display import display

with pd.option_context('precision', 2):
    display(df.groupby(['A', 'B'])['C'].describe())

           count  mean   std   min   25%   50%   75%   max
A   B                                                     
bar one      1.0  0.40   NaN  0.40  0.40  0.40  0.40  0.40
    three    1.0  2.24   NaN  2.24  2.24  2.24  2.24  2.24
    two      1.0 -0.98   NaN -0.98 -0.98 -0.98 -0.98 -0.98
foo one      2.0  1.36  0.58  0.95  1.15  1.36  1.56  1.76
    three    1.0 -0.15   NaN -0.15 -0.15 -0.15 -0.15 -0.15
    two      2.0  1.42  0.63  0.98  1.20  1.42  1.65  1.87

विशिष्ट आँकड़े प्राप्त करने के लिए, उन्हें चुनें,

df.groupby(['A', 'B'])['C'].describe()[['count', 'mean']]

           count      mean
A   B                     
bar one      1.0  0.400157
    three    1.0  2.240893
    two      1.0 -0.977278
foo one      2.0  1.357070
    three    1.0 -0.151357
    two      2.0  1.423148

describeकई कॉलम के लिए काम करता है ( ['C']करने के लिए बदल)['C', 'D'] यह पूरी तरह से हटाने के — और देखें कि क्या होता है, परिणाम एक बहु-स्तंभित स्तंभ है)।

आपको स्ट्रिंग डेटा के लिए अलग-अलग आंकड़े भी मिलते हैं। यहाँ एक उदाहरण है,

df2 = df.assign(D=list('aaabbccc')).sample(n=100, replace=True)

with pd.option_context('precision', 2):
    display(df2.groupby(['A', 'B'])
               .describe(include='all')
               .dropna(how='all', axis=1))

              C                                                   D                
          count  mean       std   min   25%   50%   75%   max count unique top freq
A   B                                                                              
bar one    14.0  0.40  5.76e-17  0.40  0.40  0.40  0.40  0.40    14      1   a   14
    three  14.0  2.24  4.61e-16  2.24  2.24  2.24  2.24  2.24    14      1   b   14
    two     9.0 -0.98  0.00e+00 -0.98 -0.98 -0.98 -0.98 -0.98     9      1   c    9
foo one    22.0  1.43  4.10e-01  0.95  0.95  1.76  1.76  1.76    22      2   a   13
    three  15.0 -0.15  0.00e+00 -0.15 -0.15 -0.15 -0.15 -0.15    15      1   c   15
    two    26.0  1.49  4.48e-01  0.98  0.98  1.87  1.87  1.87    26      2   b   15

अधिक जानकारी के लिए, दस्तावेज़ देखें ।


सभी वितरण सामान्य नहीं हैं। IQR अद्भुत होगा।
ब्रैड

7

हम ग्रुपबी और काउंट का उपयोग करके इसे आसानी से कर सकते हैं। लेकिन, हमें reset_index () का उपयोग करना याद रखना चाहिए।

df[['col1','col2','col3','col4']].groupby(['col1','col2']).count().\
reset_index()

3
यह समाधान तब तक काम करता है जब तक कि स्तंभों में कोई शून्य मान नहीं है, अन्यथा यह भ्रामक हो सकता है (समूह द्वारा अवलोकन की वास्तविक संख्या की तुलना में गणना कम होगी)।
एड्रियन

4

कई आँकड़े प्राप्त करने के लिए, सूचकांक को संक्षिप्त करें और स्तंभ नामों को बनाए रखें:

df = df.groupby(['col1','col2']).agg(['mean', 'count'])
df.columns = [ ' '.join(str(i) for i in col) for col in df.columns]
df.reset_index(inplace=True)
df

पैदा करता है:

** यहाँ छवि विवरण दर्ज करें **


1

एक समूह ऑब्जेक्ट बनाएं और नीचे दिए गए उदाहरणों की तरह कॉल करें:

grp = df.groupby(['col1',  'col2',  'col3']) 

grp.max() 
grp.mean() 
grp.describe() 

1

कृपया इस कोड को आज़माएं

new_column=df[['col1', 'col2', 'col3', 'col4']].groupby(['col1', 'col2']).count()
df['count_it']=new_column
df

मुझे लगता है कि कोड 'गणना' नामक एक कॉलम जोड़ देगा जो प्रत्येक समूह की गणना करेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.