2012-12-01 110 views
26

我想知道如何通過每對唯一列(ip,useragent)的行數來計算,通過大熊貓中唯一的一對列進行計數

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 

生產出:

ip   useragent 
192.168.0.1 a   2 
192.168.0.1 b   1 
192.168.0.2 b   1 

想法?

回答

37

如果你使用groupby,你會得到你想要的。

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

生產:

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

很好,謝謝。錯過了groupby/count/[]的最後一步。 – barnybug

+2

對我來說,那只是給出了'AttributeError:'DataFrame'對象沒有屬性'size'。 – Anaphory

+0

這對我不起作用。我得到了' MultiIndex:0 entries Empty DataFrame' Pandas Version 15.2 – feinmann

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

給出:

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

另一個不錯的選擇可能是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')) 

給出:

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