Python: Pandalar veri çerçevesindeki iki sütuna (değişkenlere) dayalı olarak bir sıklık sayısı elde edin


93

Merhaba aşağıdaki veri çerçevesine sahibim.

    Group           Size

    Short          Small
    Short          Small
    Moderate       Medium
    Moderate       Small
    Tall           Large

Aynı satırın veri çerçevesinde kaç kez göründüğünün sıklığını saymak istiyorum.

    Group           Size      Time

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

1
JPP

Yanıtlar:


145

Groupby's'i kullanabilirsiniz 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
Teşekkürler. Sıklığa ("Zaman") göre ilk k (= 20) değerlerini seçmek için küçük bir ekleme: df.groupby (["Grup", "Boyut"]). Size (). Reset_index (ad = "Zaman") .sort_values ​​(= 'Zaman', artan = Yanlış) .head (20);
Dileep Kumar Patchigolla

1
Kullanmanın bir DataFrame .size()iken Series döndürdüğüne dikkat edin .size().reset_index(name="Time"). Teşekkürler Andy.
alemol

ya da df.groupby(by=["Group", "Size"], as_index=False).size()basitçe de yapabilirsiniz
Naveen Kumar

51

Pandalar 1.1'den sonraki güncellemevalue_counts artık birden çok sütunu kabul ediyor

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

Ayrıca deneyebilirsin 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

DÜZENLEME: Çıkmak için

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
Güzel. margins=Truemarjinal sayıları elde etmek için bile ekleyebilirsiniz !
Matt Hancock

0

Diğer olasılık kullanmak .pivot_table()veaggfunc='size'

df_solution = df.pivot_table(index=['Group','Size'], aggfunc='size')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.