2013-07-29 43 views
19

Tôi có khung dữ liệu gấu trúc và nhóm nó theo hai cột (ví dụ: col1col2). Đối với các giá trị cố định của col1col2 (ví dụ: đối với nhóm), tôi có thể có nhiều giá trị khác nhau trong số col3. Tôi muốn đếm số lượng giá trị khác biệt từ các cột thứ ba.Làm cách nào để tính các giá trị khác biệt trong một cột của nhóm gấu trúc theo đối tượng?

Ví dụ, Nếu tôi có điều này như là đầu vào của tôi:

1 1 1 
1 1 1 
1 1 2 
1 2 3 
1 2 3 
1 2 3 
2 1 1 
2 1 2 
2 1 3 
2 2 3 
2 2 3 
2 2 3 

Tôi muốn có bảng (khung dữ liệu) này là kết quả:

1 1 2 
1 2 1 
2 1 3 
2 2 1 
+0

liên quan chủ đề là [.value_counts()] (https://stackoverflow.com/questions/20076195/what-is-the-most-efficient-way-of-counting-occurrences-in-pandas#20076611) – cardamom

Trả lời

22
df.groupby(['col1','col2'])['col3'].nunique().reset_index() 
+1

interestin gly 'nunique' có vẻ chậm gấp đôi so với câu trả lời của Jeff. –

+0

Lạ lùng! Tôi cũng thấy điều đó. Groupby có thể đang đi sai đường gọi là ở đây - logic áp dụng các chức năng cho các nhóm là khá dày đặc. –

+2

có nhiều chi phí hơn với việc gọi '' value_count'' (trong đó phải tái tạo lại chuỗi) trên mỗi nhóm (chứ không phải là '' unique'' chỉ trả về một ndarray). Điều này thực sự có thể không tầm thường. Nếu bạn không cần các chỉ mục bên trong hàm thì bạn thường có thể tránh hình phạt này (bằng cách không instantiating chuỗi, value_counts nào, và sau đó bị loại bỏ vì tất cả bạn cần là len của nó) – Jeff

20
In [17]: df 
Out[17]: 
    0 1 2 
0 1 1 1 
1 1 1 1 
2 1 1 2 
3 1 2 3 
4 1 2 3 
5 1 2 3 
6 2 1 1 
7 2 1 2 
8 2 1 3 
9 2 2 3 
10 2 2 3 
11 2 2 3 

In [19]: df.groupby([0,1])[2].apply(lambda x: len(x.unique())) 
Out[19]: 
0 1 
1 1 2 
    2 1 
2 1 3 
    2 1 
dtype: int64 
Các vấn đề liên quan