2014-09-02 49 views
10

Tôi có một DF trong Pandas, trông giống như:hàng trùng lặp trong gấu trúc DF

Letters Numbers 
A  1 
A  3 
A  2 
A  1 
B  1 
B  2 
B  3 
C  2 
C  2 

Tôi đang tìm để đếm số lượng hàng tương tự và lưu kết quả trong một cột thứ ba. Ví dụ: kết quả tôi tìm kiếm:

Letters Numbers Events 
A  1  2 
A  2  1 
A  3  1 
B  1  1 
B  2  1 
B  3  1 
C  2  2 

Ví dụ về những gì tôi đang tìm kiếm là here. Ý tưởng tốt nhất mà tôi đã đưa ra là sử dụng count_values(), nhưng tôi nghĩ đây chỉ là một cột. Một ý tưởng khác là sử dụng duplicated(), dù sao tôi không muốn xây dựng bất kỳ vòng lặp for nào. Tôi khá chắc chắn, rằng một thay thế Pythonic cho một vòng lặp cho tồn tại.

Trả lời

17

Bạn có thể groupby hai cột này và sau đó tính toán kích thước của các nhóm:

In [16]: df.groupby(['Letters', 'Numbers']).size() 
Out[16]: 
Letters Numbers 
A  1   2 
     2   1 
     3   1 
B  1   1 
     2   1 
     3   1 
C  2   2 
dtype: int64 

Để có được một DataFrame như trong ví dụ đầu ra của bạn, bạn có thể đặt lại chỉ mục với reset_index.

+0

Thank you very much – Guforu

+0

Ông có thể cung cấp mã bổ sung cho việc thực hiện 'reset_index() 'để có được những kết quả mong muốn. Tôi đang cố gắng làm điều dame với một vài cột hơn mà tôi muốn nhóm theo. – oliversm

6

Bạn có thể sử dụng một sự kết hợp của groupby, transform và sau đó drop_duplicates

In [84]: 

df['Events'] = df.groupby('Letters')['Numbers'].transform(pd.Series.value_counts) 
df.drop_duplicates() 
Out[84]: 
    Letters Numbers Events 
0  A  1  2 
1  A  3  1 
2  A  2  1 
4  B  1  1 
5  B  2  1 
6  B  3  1 
7  C  2  2 
+0

Cảm ơn bạn, nhưng tôi không thể hiểu tại thời điểm cú pháp của phương pháp groupby. Không nên là nhóm (['Letters', 'Numbers'])? – Guforu

+0

Không, nhóm này chỉ bằng chữ cái, và sau đó đếm cho mỗi nhóm sự xuất hiện của các giá trị trong số. Điều này sau đó kết quả giống như nhóm theo cả hai cột và tính toán kích thước của các nhóm. – joris

+0

@joris bỏ qua nhận xét cuối cùng – EdChum

Các vấn đề liên quan