Python: lấy số lượng tần suất dựa trên hai cột (biến) trong khung dữ liệu gấu trúc một số ứng dụng hàng


92

Xin chào, tôi có khung dữ liệu sau.

    Group           Size

    Short          Small
    Short          Small
    Moderate       Medium
    Moderate       Small
    Tall           Large

Tôi muốn đếm tần suất bao nhiêu lần cùng một hàng xuất hiện trong khung dữ liệu.

    Group           Size      Time

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

1
Lưu ý về hiệu suất, bao gồm các lựa chọn thay thế: Pandas groupby.size so với series.value_counts so với bộ sưu tập.Counter với nhiều chuỗi
jpp

Câu trả lời:


144

Bạn có thể sử dụng 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

7
Cảm ơn. Một bổ sung nhỏ để chọn k (= 20) giá trị hàng đầu dựa trên tần suất ("Thời gian"): df.groupby (["Nhóm", "Kích thước"]). Size (). Reset_index (name = "Thời gian") .sort_values ​​(by = 'Time', ascending = False) .head (20);
Dileep Kumar Patchigolla

1
Chỉ cần lưu ý rằng việc sử dụng .size()sẽ trả về Series trong khi .size().reset_index(name="Time")là DataFrame. Cảm ơn Andy.
alemol

hoặc bạn cũng có thể làm df.groupby(by=["Group", "Size"], as_index=False).size()đơn giản
Naveen Kumar

51

Cập nhật sau khi pandas 1.1value_countshiện chấp nhận nhiều cột

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

Bạn cũng có thể thử 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

CHỈNH SỬA: Để mang lại hiệu quả

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
đẹp. bạn thậm chí có thể thêm margins=Trueđể có được số lượng biên!
Matt Hancock

0

Khả năng tạo ra khác đang sử dụng .pivot_table()aggfunc='size'

df_solution = df.pivot_table(index=['Group','Size'], aggfunc='size')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.