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?

Nilani Algiriyage
quelle
Eine sehr ähnliche Frage ist erst gestern aufgetaucht. Siehe hier .
Bdiamante
Hinweis zur Leistung, einschließlich Alternativen: Pandas groupby.size vs series.value_counts vs collection.Counter mit mehreren Serien
jpp

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
Wartenkuo
quelle
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
Andy Hayden
quelle
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

Der Gr8 Adakron
quelle
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.

Ted Petrou
quelle
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.)

Tom
quelle
-2

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

df.groupby(['col5','col2']).count()
seansio1995
quelle