Python: dapatkan jumlah frekuensi berdasarkan dua kolom (variabel) di pandas dataframe beberapa baris appers

93

Halo Saya memiliki dataframe berikut.

    Group           Size

    Short          Small
    Short          Small
    Moderate       Medium
    Moderate       Small
    Tall           Large

Saya ingin menghitung frekuensi berapa kali baris yang sama muncul di dataframe.

    Group           Size      Time

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

Jawaban:

145

Anda dapat menggunakan groupby's 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
sumber
7
Terima kasih. Satu tambahan kecil untuk memilih nilai k (= 20) teratas berdasarkan frekuensi ("Waktu"): df.groupby (["Group", "Size"]). Size (). Reset_index (name = "Time") .sort_values ​​(by = 'Time', ascending = False) .head (20);
Dileep Kumar Patchigolla
1
Perhatikan saja bahwa menggunakan .size()akan mengembalikan Seri sementara .size().reset_index(name="Time")adalah DataFrame. Terima kasih Andy.
alemol
atau Anda juga bisa melakukan df.groupby(by=["Group", "Size"], as_index=False).size()hanya
Naveen Kumar
51

Perbarui setelah pandas 1.1value_countssekarang menerima beberapa kolom

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

Anda juga bisa mencoba 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: Untuk mendapatkan hasil Anda

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
sumber
7
bagus. Anda bahkan dapat menambahkan margins=Trueuntuk mendapatkan jumlah marjinal!
Matt Hancock
0

Kemungkinan lain menggunakan .pivot_table()danaggfunc='size'

df_solution = df.pivot_table(index=['Group','Size'], aggfunc='size')
asantz96.dll
sumber