Pandas DataFrame Gruppieren Sie nach zwei Spalten und erhalten Sie die Anzahl


165

Ich habe einen Pandas-Datenrahmen im folgenden Format:

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']

df:

   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

Jetzt möchte ich dies in zwei Spalten wie folgt gruppieren:

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

Ausgabe:

             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

Ich möchte die Anzahl für jede Zeile wie folgt erhalten. Erwartete Ausgabe:

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

Wie erhalte ich meine erwartete Ausgabe? Und ich möchte die größte Anzahl für jeden 'col2'-Wert finden?


Eine sehr ähnliche Frage ist erst gestern aufgetaucht. Siehe hier .
Bdiamante

Antworten:


114

Gefolgt von der Antwort von @ Andy, können Sie Folgendes tun, um Ihre zweite Frage zu lösen:

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

1
Kann ich dafür "col5" -Werte wie C ... 1 ... 3 erhalten?
Nilani Algiriyage

141

Sie suchen 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

Um die gleiche Antwort wie "waitkuo" (die "zweite Frage") zu erhalten, aber etwas sauberer, müssen Sie nach Level gruppieren:

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

1
Ich weiß nicht, warum ich das vergessen habe: O, was ist mit meiner zweiten Frage? Finde die größte Anzahl für jeden "col2" -Wert und erhalte den entsprechenden "col5" -Wert?
Nilani Algiriyage

23

Einfügen von Daten in einen Pandas-Datenrahmen und Angabe des Spaltennamens .

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.

Dies sind unsere gedruckten Daten:

Geben Sie hier die Bildbeschreibung ein

Um eine Gruppe von Datenrahmen in Pandas und Zählern zu erstellen , müssen
Sie eine weitere Spalte angeben , die die Gruppierung zählt . Nennen wir diese Spalte im Datenrahmen "COUNTER" .

So was:

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

AUSGABE:

Geben Sie hier die Bildbeschreibung ein


9
Wie kann ich die Alphabet-Spalte (z. B. A) dazu bringen, sich unten zu wiederholen und die Lücken in der ersten Spalte nicht zu belassen?
Blissweb

Wie kann man auf den Wert jeder Gruppe zugreifen, der eine Summe ist, die auf dem Alphabet und dem Wort basiert?
Rahul Goyal

21

Idiomatische Lösung, die nur eine einzige Gruppe verwendet

(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

Erläuterung

Das Ergebnis der Groupby- sizeMethode ist eine Serie mit col5und col2im Index. Von hier aus können Sie eine andere groupby-Methode verwenden, um den Maximalwert jedes Werts in zu ermitteln. Dies col2ist jedoch nicht erforderlich. Sie können einfach alle Werte absteigend sortieren und dann nur die Zeilen mit dem ersten Auftreten von col2mit der drop_duplicatesMethode beibehalten.


Es gibt keine param genannt namein reset_index()der aktuellen Version von Pandas: pandas.pydata.org/pandas-docs/stable/generated/...
MMB


Ok, mein schlechtes. Ich habe es benutzt, wenn ich DataFramenicht damit gearbeitet habe Series. Danke für den Link.
mmBs

2

Wenn Sie eine neue Spalte (z. B. 'count_column') mit den Gruppenzahlen in den Datenrahmen einfügen möchten:

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

(Ich habe 'col5' ausgewählt, da es keine Nan enthält.)


-2

Sie können einfach die Anzahl der integrierten Funktionen verwenden, gefolgt von der Funktion groupby

df.groupby(['col5','col2']).count()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.