it-swarm.dev

الباندا DataFrame Groupby عمودين والحصول على التهم الموجهة إليه

لدي قاعدة بيانات الباندا في التنسيق التالي:

df = pd.DataFrame([[1.1, 1.1, 1.1, 2.6, 2.5, 3.4,2.6,2.6,3.4,3.4,2.6,1.1,1.1,3.3], list('AAABBBBABCBDDD'), [1.1, 1.7, 2.5, 2.6, 3.3, 3.8,4.0,4.2,4.3,4.5,4.6,4.7,4.7,4.8], ['x/y/z','x/y','x/y/z/n','x/u','x','x/u/v','x/y/z','x','x/u/v/b','-','x/y','x/y/z','x','x/u/v/w'],['1','3','3','2','4','2','5','3','6','3','5','1','1','1']]).T
df.columns = ['col1','col2','col3','col4','col5']

مدافع:

   col1 col2 col3     col4 col5
0   1.1    A  1.1    x/y/z    1
1   1.1    A  1.7      x/y    3
2   1.1    A  2.5  x/y/z/n    3
3   2.6    B  2.6      x/u    2
4   2.5    B  3.3        x    4
5   3.4    B  3.8    x/u/v    2
6   2.6    B    4    x/y/z    5
7   2.6    A  4.2        x    3
8   3.4    B  4.3  x/u/v/b    6
9   3.4    C  4.5        -    3
10  2.6    B  4.6      x/y    5
11  1.1    D  4.7    x/y/z    1
12  1.1    D  4.7        x    1
13  3.3    D  4.8  x/u/v/w    1

الآن أريد تجميع هذا بواسطة عمودين مثل التالي:

df.groupby(['col5','col2']).reset_index()

انتاج:

             index col1 col2 col3     col4 col5
col5 col2                                      
1    A    0      0  1.1    A  1.1    x/y/z    1
     D    0     11  1.1    D  4.7    x/y/z    1
          1     12  1.1    D  4.7        x    1
          2     13  3.3    D  4.8  x/u/v/w    1
2    B    0      3  2.6    B  2.6      x/u    2
          1      5  3.4    B  3.8    x/u/v    2
3    A    0      1  1.1    A  1.7      x/y    3
          1      2  1.1    A  2.5  x/y/z/n    3
          2      7  2.6    A  4.2        x    3
     C    0      9  3.4    C  4.5        -    3
4    B    0      4  2.5    B  3.3        x    4
5    B    0      6  2.6    B    4    x/y/z    5
          1     10  2.6    B  4.6      x/y    5
6    B    0      8  3.4    B  4.3  x/u/v/b    6

أريد الحصول على العد بكل صف مثل التالي. الناتج المتوقع:

col5 col2 count
1    A      1
     D      3
2    B      2
etc...

كيفية الحصول على الناتج المتوقع لي؟ وأريد العثور على أكبر عدد لكل قيمة "col2"؟

97
Nilani Algiriyage

تليها إجابة @ Andy ، يمكنك القيام بما يلي لحل سؤالك الثاني:

In [56]: df.groupby(['col5','col2']).size().reset_index().groupby('col2')[[0]].max()
Out[56]: 
      0
col2   
A     3
B     2
C     1
D     3
66
waitingkuo

أنت تبحث عن size :

In [11]: df.groupby(['col5', 'col2']).size()
Out[11]:
col5  col2
1     A       1
      D       3
2     B       2
3     A       3
      C       1
4     B       1
5     B       2
6     B       1
dtype: int64

للحصول على نفس الإجابة مثل waitkuo ("السؤال الثاني") ، ولكن أنظف قليلاً ، هو تجميع المستوى:

In [12]: df.groupby(['col5', 'col2']).size().groupby(level=1).max()
Out[12]:
col2
A       3
B       2
C       1
D       3
dtype: int64
92
Andy Hayden

إدراج البيانات في إطار بيانات الباندا و تقديم اسم العمود .

import pandas as pd
df = pd.DataFrame([['A','C','A','B','C','A','B','B','A','A'], ['ONE','TWO','ONE','ONE','ONE','TWO','ONE','TWO','ONE','THREE']]).T
df.columns = [['Alphabet','Words']]
print(df)   #printing dataframe.

هذه هي بياناتنا المطبوعة:

 enter image description here 

لصنعمجموعة من dataframe في الباندا والعداد،
تحتاج إلى توفير عمود آخر يحسب التجميع ، دعنا نسمي هذا العمود كـ ، "COUNTER" في dataframe .

مثله:

df['COUNTER'] =1       #initially, set that counter to 1.
group_data = df.groupby(['Alphabet','Words'])['COUNTER'].sum() #sum function
print(group_data)

الناتج:

 enter image description here 

16
The Gr8 Adakron

الحل الاصطلاحي الذي يستخدم مجموعة واحدة فقط

df.groupby(['col5', 'col2']).size() \
  .sort_values(ascending=False) \
  .reset_index(name='count') \
  .drop_duplicates(subset='col2')

  col5 col2  count
0    3    A      3
1    1    D      3
2    5    B      2
6    3    C      1

تفسير

نتيجة طريقة groupby size هي سلسلة مع col5 و col2 في الفهرس. من هنا ، يمكنك استخدام طريقة تجميع أخرى للعثور على الحد الأقصى لقيمة كل قيمة في col2 لكن ليس من الضروري القيام بذلك. يمكنك ببساطة فرز جميع القيم تنازليًا ثم الاحتفاظ فقط بالصفوف مع التواجد الأول لـ col2 باستخدام طريقة drop_duplicates.

6
Ted Petrou

إذا كنت تريد إضافة عمود جديد (قل "count_column") يحتوي على تعدادات المجموعات في إطار البيانات:

df.count_column=df.groupby(['col5','col2']).col5.transform('count')

(لقد اخترت "col5" لأنه لا يحتوي على نان)

1
Tom