2016-05-02 30 views
2

Bei einer Pandas-Serie vom Typ str möchte ich die Häufigkeiten des Ergebnisses von str.split erhalten.Pandas Zählfrequenzen innerhalb der Str-Serie

Zum Beispiel angesichts der Serie

s = pd.Series(['abc,def,ghi','ghi,abc']) 

Ich möchte

abc: 2 
def: 1 
ghi: 2 

als Ergebnis erhalten. Wie kann ich das bekommen?

Edit: Die Lösung sollte effizient mit einer großen Serie von 50 Millionen Zeilen arbeiten.

Antwort

3

Eine andere Lösung mit pandas str.split, sum und value_counts:

print pd.Series(s.str.split(',').sum()).value_counts() 
abc 2 
ghi 2 
def 1 
dtype: int64 

EDIT:

efficent Weitere Methoden:

import pandas as pd 
s = pd.Series(['abc,def,ghi','ghi,abc']) 
s = pd.concat([s]*10000).reset_index(drop=True) 

In [17]: %timeit pd.Series(s.str.split(',').sum()).value_counts() 
1 loops, best of 3: 3.1 s per loop 

In [18]: %timeit s.str.split(',', expand=True).stack().value_counts() 
10 loops, best of 3: 46.2 ms per loop 

In [19]: %timeit pd.DataFrame([ x.split(',') for x in s.tolist() ]).stack().value_counts() 
10 loops, best of 3: 22.2 ms per loop 

In [20]: %timeit pd.Series([item for sublist in [ x.split(',') for x in s.tolist() ] for item in sublist]).value_counts() 
100 loops, best of 3: 16.6 ms per loop 
+0

'pd.Series (s.str.split (','). Sum()). Value_counts()' - das ist schön! – MaxU

+0

Danke, MaxU. Schöner Tag. – jezrael

+0

Der Aufruf von 'sum()' scheint auf einem großen Datenrahmen von 50 Millionen Zeilen wirklich langsam zu sein. Gibt es eine Alternative? – David

3

ist das was du willst?

In [29]: from collections import Counter 

In [30]: Counter(s.str.split(',').sum()) 
Out[30]: Counter({'abc': 2, 'def': 1, 'ghi': 2}) 

oder

In [34]: a = pd.Series(s.str.split(',').sum()) 

In [35]: a 
Out[35]: 
0 abc 
1 def 
2 ghi 
3 ghi 
4 abc 
dtype: object 

In [36]: a.groupby(a).size() 
Out[36]: 
abc 2 
def 1 
ghi 2 
dtype: int64 
+1

Sie sind ein Genie! Vielen Dank! Ich habe lange darüber nachgedacht! – David

+0

@ David, immer froh zu helfen! :) – MaxU

+0

Eigentlich scheint es schwieriger als ursprünglich gedacht. Ich arbeite mit einer großen Serie mit etwa 50 Millionen Zeilen. Der Aufruf von 'sum()' scheint jedoch sehr langsam zu sein. Gibt es eine Alternative? – David

Verwandte Themen