शीघ्र जवाब:
प्रति समूह पंक्ति गणना प्राप्त करने का सबसे सरल तरीका कॉलिंग है .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
बारे में आपको बताए बिना मतलब गणना में प्रविष्टियां छोड़ देंगे ।
df[['col1','col2','col3','col4']].groupby(['col1','col2']).agg(['mean', 'count'])