পান্ডাস গ্রুপবাই ব্যবহার করে প্রতিটি গ্রুপের জন্য পরিসংখ্যান (যেমন গণনা, গড়, ইত্যাদি) পান?


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প্রতি গ্রুপে মাত্র একটি কলাম পেতে চান তবে আমার উত্তরটি দেখুন ।
পেড্রো এম ডুয়ার্টে

আমার যদি আলাদা আলাদা কাউন্স্ট থাকে এবং গ্রুপবদ্ধ ধরণের সারিগুলি গণনা করার পরিবর্তে, আমার কলামগুলি গণনা করা উচিত along
অভিষেক ভাটিয়া 21

@ জায়ান 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
আরে, আমি আপনার সমাধানটি সত্যিই পছন্দ করি, বিশেষত সর্বশেষটি, যেখানে আপনি পদ্ধতি শৃঙ্খলা ব্যবহার করেন। তবে, যেহেতু এটি প্রায়শই প্রয়োজনীয়, বিভিন্ন কলামে বিভিন্ন সংহতকরণ ফাংশন প্রয়োগ করার জন্য, কেউ পিডি কোডক্যাট ব্যবহার করে ফলাফল ডেটা ফ্রেমগুলিকেও একত্রিত করতে পারে। সাবস্কিউেন্ট চেইনিংয়ের চেয়ে এটি পড়া সহজতর
কুইকবিয়াম 2 কে 1

4
চমৎকার সমাধান, কিন্তু In [5]: counts_df = pd.DataFrame(df.groupby('col1').size().rename('counts')), হয়তো এটা আকার () সেট করতে নতুন কলাম যেন আপনি আরও বিশ্লেষণের জন্য dataframe, যা হওয়া উচিত নিপূণভাবে চাই ভালোcounts_df = pd.DataFrame(df.groupby('col1').size().reset_index(name='counts')
LancelotHolmes

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']-অথবা অপসারণ এটা পুরাপুরি-এবং দেখুন সেখানে কি ঘটছে, ফলে একটি MultiIndexed স্তম্ভময় dataframe যায়)।

স্ট্রিং ডেটার জন্য আপনি বিভিন্ন পরিসংখ্যানও পান। এখানে একটি উদাহরণ,

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

আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন


সমস্ত বিতরণ স্বাভাবিক হয় না। আইকিউআর আশ্চর্যজনক হবে।
ব্র্যাড

7

আমরা সহজেই গ্রুপবাই এবং গণনা ব্যবহার করে এটি করতে পারি। তবে, আমাদের রিসেট_ইন্ডেক্স () ব্যবহার করতে হবে remember

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

আমি মনে করি যে কোডটি প্রতিটি গ্রুপের কোন গণনা 'কাউন্ট এটি' নামে একটি কলাম যুক্ত করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.