Python: uzyskaj liczbę częstotliwości na podstawie dwóch kolumn (zmiennych) w pandach dataframe niektórych aplikacji wierszowych

93

Witam mam następującą ramkę danych.

    Group           Size

    Short          Small
    Short          Small
    Moderate       Medium
    Moderate       Small
    Tall           Large

Chcę policzyć, ile razy ten sam wiersz pojawia się w ramce danych.

    Group           Size      Time

    Short          Small        2
    Moderate       Medium       1 
    Moderate       Small        1
    Tall           Large        1
emax
źródło

Odpowiedzi:

145

Możesz użyć funkcji Groupby 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
źródło
7
Dzięki. Jeden niewielki dodatek do wybrania najwyższych wartości k (= 20) na podstawie częstotliwości („Czas”): df.groupby ([„Grupa”, „Rozmiar”]). Size (). Reset_index (name = „Czas”) .sort_values ​​(by = 'Czas', rosnąco = Fałsz) .head (20);
Dileep Kumar Patchigolla
1
Zwróć uwagę, że użycie .size()zwróci Series, gdy .size().reset_index(name="Time")jest DataFrame. Dzięki Andy.
alemol
lub możesz też zrobić df.groupby(by=["Group", "Size"], as_index=False).size()po prostu
Naveen Kumar
51

Aktualizacja po pandach 1.1value_countsakceptuje teraz wiele kolumn

df.value_counts(["Group", "Size"])

Możesz też spróbować 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

EDYCJA: Aby uzyskać wyjście

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
źródło
7
ładny. możesz nawet dodać, margins=Trueaby uzyskać marginalne liczby!
Matt Hancock
0

Inną możliwością jest używanie .pivot_table()iaggfunc='size'

df_solution = df.pivot_table(index=['Group','Size'], aggfunc='size')
asantz96
źródło