Python: Ermitteln Sie eine Häufigkeitszählung basierend auf zwei Spalten (Variablen) im Pandas-Datenrahmen einiger Zeilen-Apper


91

Hallo, ich habe den folgenden Datenrahmen.

    Group           Size

    Short          Small
    Short          Small
    Moderate       Medium
    Moderate       Small
    Tall           Large

Ich möchte die Häufigkeit zählen, mit der dieselbe Zeile im Datenrahmen angezeigt wird.

    Group           Size      Time

    Short          Small        2
    Moderate       Medium       1 
    Moderate       Small        1
    Tall           Large        1

Antworten:


139

Sie können groupby's verwenden size:

In [11]: df.groupby(["Group", "Size"]).size()
Out[11]:
Group     Size
Moderate  Medium    1
          Small     1
Short     Small     2
Tall      Large     1
dtype: int64

In [12]: df.groupby(["Group", "Size"]).size().reset_index(name="Time")
Out[12]:
      Group    Size  Time
0  Moderate  Medium     1
1  Moderate   Small     1
2     Short   Small     2
3      Tall   Large     1

7
Vielen Dank. Eine kleine Ergänzung zum Auswählen der oberen k (= 20) -Werte basierend auf der Häufigkeit ("Zeit"): df.groupby (["Gruppe", "Größe"]). Size (). Reset_index (name = "Time") .sort_values ​​(by = 'Time', ascending = False) .head (20);
Dileep Kumar Patchigolla

1
Beachten Sie nur, dass die Verwendung von .size()will Series zurückgibt, während .size().reset_index(name="Time")es sich um einen DataFrame handelt. Danke Andy.
Alemol

oder Sie könnten es auch df.groupby(by=["Group", "Size"], as_index=False).size()einfach tun
Naveen Kumar

49

Sie können es auch versuchen pd.crosstab()

Group           Size

Short          Small
Short          Small
Moderate       Medium
Moderate       Small
Tall           Large

pd.crosstab(df.Group,df.Size)


Size      Large  Medium  Small
Group                         
Moderate      0       1      1
Short         0       0      2
Tall          1       0      0

EDIT: Um Ihre Ausgabe zu bekommen

pd.crosstab(df.Group,df.Size).replace(0,np.nan).\
     stack().reset_index().rename(columns={0:'Time'})
Out[591]: 
      Group    Size  Time
0  Moderate  Medium   1.0
1  Moderate   Small   1.0
2     Short   Small   2.0
3      Tall   Large   1.0

7
nett. Sie können sogar hinzufügen margins=True, um die Grenzwerte zu erhalten!
Matt Hancock

0

Andere Möglichkeiten sind .pivot_table()undaggfunc='size'

df_solution = df.pivot_table(index=['Group','Size'], aggfunc='size')
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.