2012-12-01 16 views
26

Próbuję dowiedzieć się, jak liczyć według liczby wierszy na unikatową parę kolumn (ip, useragent), np.Liczenie według unikatowej pary kolumn w pandach

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 

Aby wyprodukować:

ip   useragent 
192.168.0.1 a   2 
192.168.0.1 b   1 
192.168.0.2 b   1 

pomysły?

Odpowiedz

37

Jeśli używasz groupby, dostaniesz to, co chcesz.

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

produkuje:

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

Wielki, dzięki. Utracono ostatni krok na grupie/count/[]. – barnybug

+2

Dla mnie to po prostu daje 'AttributeError: 'Obiekt DataFrame' nie ma atrybutu 'size''. – Anaphory

+0

To nie działa dla mnie. Dostaję pandas. .core.frame.DataFrame '> MultiIndex: 0 wpisów Puste DataFrame' Pandy Wersja 15.2 – feinmann

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

daje:

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

Kolejną miłą opcją może być 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')) 

daje:

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 
Powiązane problemy