English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

groupBy في Pandas

مثال على عملية GroupBy في Pandas

أي عملية groupby ستقوم بتنفيذ ما يلي على الكائن الأصلي:

قسمة الكائن تطبيق الدالة دمج النتائج

في العديد من الحالات، نقوم بتقسيم البيانات إلى عدة مجموعات، ثم نطبق بعض الوظائف على كل مجموعة. في وظيفة Apply، يمكننا تنفيذ ما يلي-

جمع − حساب الإحصاءات المجمعة تحويل − عمليات المجموعات تصفية − فرز البيانات تحت بعض الشروط

الآن نقوم بإنشاء عمود DataFrame ونقوم بكل العمليات عليه.

#إدخال المكتبة pandas
 import pandas as pd
 ipl_data = {'Team': ['Riders'، 'Riders'، 'Devils'، 'Devils'، 'Kings',
    الملوك، 'Kings'، 'Kings'، 'Riders'، 'Royals'، 'Royals'، 'Riders'],
    'Rank': [1, 2, 2, 3, 3, 4, 1, 1, 2, 4, 1, 2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]
 df = pd.DataFrame(ipl_data)
 print(df)

نتائج التنفيذ كالتالي:

      نقاط            ترتيب             فريق         سنة
0                 876                 1             Riders         2014
1                 789                 2             Riders         2015
2                 863                 2             Devils         2014
3                 673                 3             Devils         2015
4                 741                 3             Kings         2014
5                 812                 4             kings         2015
6                 756                 1             Kings         2016
7 788 1 Kings 2017
8 694 2 Riders 2016
9 701 4 Royals 2014
10 804 1 Royals 2015
11 690 2 Riders 2017

تقسيم البيانات إلى مجموعات

يمكن تقسيم الشكل إلى أي كائن. هناك العديد من طرق تقسيم الكائنات، مثل:

obj.groupby('key') obj.groupby(['key1','key2']) obj.groupby(key,axis=1)

الآن دعونا نرى كيف يمكن تطبيق كائن التجميع على كائن DataFrame

مثال

# import the pandas library
 import pandas as pd
 ipl_data = {'Team': ['Riders'، 'Riders'، 'Devils'، 'Devils'، 'Kings',
    الملوك، 'Kings'، 'Kings'، 'Riders'، 'Royals'، 'Royals'، 'Riders'],
    'Rank': [1, 2, 2, 3, 3, 4, 1, 1, 2, 4, 1, 2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]
 df = pd.DataFrame(ipl_data)
 print(df.groupby('Team'))

نتائج التنفيذ كالتالي:

   

للنظر في المجموعات

# import the pandas library
 import pandas as pd
 ipl_data = {'Team': ['Riders'، 'Riders'، 'Devils'، 'Devils'، 'Kings',
    الملوك، 'Kings'، 'Kings'، 'Riders'، 'Royals'، 'Royals'، 'Riders'],
    'Rank': [1, 2, 2, 3, 3, 4, 1, 1, 2, 4, 1, 2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]
 df = pd.DataFrame(ipl_data)
 print(df.groupby('Team').groups)

نتائج التنفيذ كالتالي:

   {'Kings': Int64Index([4, 6, 7], dtype='int64'),
 'Devils': Int64Index([2, 3], dtype='int64'),
 'Riders': Int64Index([0, 1, 8, 11], dtype='int64'),
 'Royals': Int64Index([9, 10], dtype='int64'),
 'kings' : Int64Index([5], dtype='int64')}

مثال

باستخدام المجموعات المتعددة

# import the pandas library
 import pandas as pd
 ipl_data = {'Team': ['Riders'، 'Riders'، 'Devils'، 'Devils'، 'Kings',
    الملوك، 'Kings'، 'Kings'، 'Riders'، 'Royals'، 'Royals'، 'Riders'],
    'Rank': [1, 2, 2, 3, 3, 4, 1, 1, 2, 4, 1, 2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]
 df = pd.DataFrame(ipl_data)
 print(df.groupby(['Team','Year']).groups)

نتائج التنفيذ كالتالي:

   {('Kings', 2014): Int64Index([4], dtype='int64'),
  ('Royals', 2014): Int64Index([9], dtype='int64'),
  ('Riders', 2014): Int64Index([0], dtype='int64'),
  ('Riders', 2015): Int64Index([1], dtype='int64'),
  ('Kings', 2016): Int64Index([6], dtype='int64'),
  ('Riders', 2016): Int64Index([8], dtype='int64'),
  ('Riders', 2017): Int64Index([11], dtype='int64'),
  ('Devils', 2014): Int64Index([2], dtype='int64'),
  ('Devils', 2015): Int64Index([3], dtype='int64'),
  ('kings', 2015): Int64Index([5], dtype='int64'),
  ('Royals', 2015): Int64Index([10], dtype='int64'),
  ('Kings', 2017): Int64Index([7], dtype='int64')}

استكشاف المجموعات

مع وجود obj من groupby، يمكننا استكشاف هذا العنصر مثل itertools.obj.

# import the pandas library
 import pandas as pd
 ipl_data = {'Team': ['Riders'، 'Riders'، 'Devils'، 'Devils'، 'Kings',
    الملوك، 'Kings'، 'Kings'، 'Riders'، 'Royals'، 'Royals'، 'Riders'],
    'Rank': [1, 2, 2, 3, 3, 4, 1, 1, 2, 4, 1, 2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]
 df = pd.DataFrame(ipl_data)
 grouped = df.groupby('Year')
 for name,group in grouped:
    print(name)
    print(group)

نتائج التنفيذ كالتالي:

  2014
   نقاط مركز الترتيب فريق سنة
0	876	1	Riders	2014
2	863	2	Devils	2014
4	741	3	Kings	2014
9	701	4	Royals	2014
2015
   نقاط مركز الترتيب فريق سنة
1	789	2	Riders	2015
3	673	3	Devils	2015
5	812	4	kings	2015
10	804	1	Royals	2015
2016
   نقاط مركز الترتيب فريق سنة
6	756	1	Kings	2016
8	694	2	Riders	2016
2017
   نقاط	تصنيف	فرق	سنة
7	788	1	Kings	2017
11	690	2	Riders	2017

بالتقديم، اسم العلامة الموجودة على groupby هو نفس اسم المجموعة.

اختيار مجموعة p

باستخدام طريقة get_group()، يمكننا اختيار مجموعة.

# import the pandas library
 import pandas as pd
 ipl_data = {'Team': ['Riders'، 'Riders'، 'Devils'، 'Devils'، 'Kings',
    الملوك، 'Kings'، 'Kings'، 'Riders'، 'Royals'، 'Royals'، 'Riders'],
    'Rank': [1, 2, 2, 3, 3, 4, 1, 1, 2, 4, 1, 2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]
 df = pd.DataFrame(ipl_data)
 grouped = df.groupby('Year')
 print(grouped.get_group(2014))

نتائج التنفيذ كالتالي:

     نقاط	تصنيف	فرق	سنة
0     876     1   Riders    2014
2     863     2   Devils    2014
4     741     3   Kings     2014
9     701     4   Royals    2014

الجماعة

تعود الوظائف التجميعية إلى كل مجموعة قيمة تجمعية. بمجرد إنشاء عنصر التجميع، يمكن تنفيذ عدة عمليات تجميع على البيانات المجمعة.

طريقة واضحة هي استخدام التجميع أو طريقة agg المماثلة.

# import the pandas library
 import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders'، 'Riders'، 'Devils'، 'Devils'، 'Kings',
    الملوك، 'Kings'، 'Kings'، 'Riders'، 'Royals'، 'Royals'، 'Riders'],
    'Rank': [1, 2, 2, 3, 3, 4, 1, 1, 2, 4, 1, 2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]
 df = pd.DataFrame(ipl_data)
 grouped = df.groupby('Year')
 print(grouped['Points'].agg(np.mean))

نتائج التنفيذ كالتالي:

  Year
2014   795.25
2015   769.50
2016   725.00
2017   739.00
Name: Points, dtype: float64

طريقة أخرى لمعرفة حجم كل مجموعة هي عن طريق تطبيق وظيفة size().

import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders'، 'Riders'، 'Devils'، 'Devils'، 'Kings',
    الملوك، 'Kings'، 'Kings'، 'Riders'، 'Royals'، 'Royals'، 'Riders'],
    'Rank': [1, 2, 2, 3, 3, 4, 1, 1, 2, 4, 1, 2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]
 df = pd.DataFrame(ipl_data)
 Access to Attribute in Python Pandas
 grouped = df.groupby('Team')
 print(grouped.agg(np.size))

نتائج التنفيذ كالتالي:

       Points   Rank   Year
Team
Devils        2      2      2
Kings         3      3      3
Riders        4      4      4
Royals        2      2      2
kings         1      1      1

تطبيق多个 وظائف تجميع في وقت واحد

باستخدام Series المجموعة، يمكنك أيضًا نقل قائمة أو دictionary من الوظائف للجمع، وإنشاء DataFrame كنتج-

# import the pandas library
 import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders'، 'Riders'، 'Devils'، 'Devils'، 'Kings',
    الملوك، 'Kings'، 'Kings'، 'Riders'، 'Royals'، 'Royals'، 'Riders'],
    'Rank': [1, 2, 2, 3, 3, 4, 1, 1, 2, 4, 1, 2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]
 df = pd.DataFrame(ipl_data)
 grouped = df.groupby('Team')
 print(grouped['Points'].agg([np.sum, np.mean, np.std]))

نتائج التنفيذ كالتالي:

  Team      sum      mean          std
Devils   1536   768.000000   134.350288
Kings    2285   761.666667    24.006943
Riders   3049   762.250000    88.567771
Royals   1505   752.500000    72.831998
الملوك     812   812.000000          NaN

تحويل

تحويل على مجموعات أو أعمدة سيعود إلى فهرس، والذي حجمه يتوافق مع حجم العنصر المجموع. لذلك، يجب أن يكون الحجم الناتج متساوياً مع حجم قطعة المجموعة.

# import the pandas library
 import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders'، 'Riders'، 'Devils'، 'Devils'، 'Kings',
    الملوك، 'Kings'، 'Kings'، 'Riders'، 'Royals'، 'Royals'، 'Riders'],
    'Rank': [1, 2, 2, 3, 3, 4, 1, 1, 2, 4, 1, 2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]
 df = pd.DataFrame(ipl_data)
 grouped = df.groupby('Team')
 score = lambda x: (x - x.mean()) / x.std()*10
 print(grouped.transform(score))

نتائج التنفيذ كالتالي:

     نقاط        المركز        السنة
0   12.843272  -15.000000  -11.618950
1   3.020286     5.000000   -3.872983
2   7.071068    -7.071068   -7.071068
3  -7.071068     7.071068    7.071068
4  -8.608621    11.547005  -10.910895
5        NaN          NaN         NaN
6  -2.360428    -5.773503    2.182179
7  10.969049    -5.773503    8.728716
8  -7.705963     5.000000    3.872983
9  -7.071068     7.071068   -7.071068
10  7.071068    -7.071068    7.071068
11 -8.157595     5.000000   11.618950

تصفية

تصفية تصفية البيانات بناءً على الشروط المحددة وإرجاع مجموعة فرعية من البيانات. وظيفة المرشح() تستخدم لتحديد البيانات.

 import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders'، 'Riders'، 'Devils'، 'Devils'، 'Kings',
    الملوك، 'Kings'، 'Kings'، 'Riders'، 'Royals'، 'Royals'، 'Riders'],
    'Rank': [1, 2, 2, 3, 3, 4, 1, 1, 2, 4, 1, 2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]
 df = pd.DataFrame(ipl_data)
 print(df.groupby('Team').filter(lambda x: len(x) >= 3))

نتائج التنفيذ كالتالي:

      نقاط مركز الترتيب فريق سنة
0 876 1 Riders 2014
1 789 2 Riders 2015
4 741 3 Kings 2014
6 756 1 Kings 2016
7 788 1 Kings 2017
8 694 2 Riders 2016
11 690 2 Riders 2017