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
emax
quelle
1
Hinweis zur Leistung, einschließlich Alternativen: Pandas groupby.size vs series.value_counts vs collection.Counter mit mehreren Serien
jpp

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
Andy Hayden
quelle
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
BEN_YO
quelle
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')
asantz96
quelle