2012-12-01 44 views
26

Tôi đang cố gắng tìm hiểu cách đếm theo số hàng trên mỗi cặp cột duy nhất (ip, useragent), ví dụ:Đếm theo cặp cột duy nhất trong gấu trúc

d = pd.DataFrame({'ip': ['192.168.0.1', '192.168.0.1', '192.168.0.1', '192.168.0.2'], 'useragent': ['a', 'a', 'b', 'b']}) 

    ip    useragent 
0 192.168.0.1  a 
1 192.168.0.1  a 
2 192.168.0.1  b 
3 192.168.0.2  b 

Để sản xuất:

ip   useragent 
192.168.0.1 a   2 
192.168.0.1 b   1 
192.168.0.2 b   1 

Ý tưởng?

Trả lời

37

Nếu bạn sử dụng nhóm, bạn sẽ nhận được những gì bạn muốn.

d.groupby(['ip', 'useragent']).count() 

sản xuất:

ip   useragent    
192.168.0.1 a   2 
      b   1 
192.168.0.2 b   1 
+0

Tuyệt vời, cảm ơn. Bỏ lỡ bước cuối cùng trong nhóm/count/[]. – barnybug

+2

Đối với tôi, điều đó chỉ cho đối tượng 'AttributeError: 'DataFrame' không có thuộc tính 'size''. – Anaphory

+0

Điều này không hiệu quả đối với tôi. Tôi nhận được ' MultiIndex: 0 mục Empty DataFrame' Pandas Phiên bản 15.2 – feinmann

1
print(d.groupby(['ip', 'useragent']).size().reset_index().rename(columns={0:''})) 

cho:

  ip useragent 
0 192.168.0.1   a 2 
1 192.168.0.1   b 1 
2 192.168.0.2   b 1 

Một lựa chọn tốt đẹp có thể pandas.crosstab:

print(pd.crosstab(d.ip, d.useragent)) 
print('\nsome cosmetics:') 
print(pd.crosstab(d.ip, d.useragent).reset_index().rename_axis('',axis='columns')) 

cho:

useragent a b 
ip    
192.168.0.1 2 1 
192.168.0.2 0 1 

some cosmetics: 
      ip a b 
0 192.168.0.1 2 1 
1 192.168.0.2 0 1 
Các vấn đề liên quan