2016-05-27 16 views

risposta

7

IIUC allora si può fare quanto segue:

In [89]: 
count = df['fruits'].str.split().apply(len).value_counts() 
count.index = count.index.astype(str) + ' words:' 
count.sort_index(inplace=True) 
count 

Out[89]: 
1 words: 2 
2 words: 2 
3 words: 1 
4 words: 1 
Name: fruits, dtype: int64 

Qui utilizzare lo str.split vettorizzato per dividere gli spazi, quindi applylen per ottenere il conteggio del numero di el ements, possiamo quindi chiamare value_counts per aggregare il conteggio delle frequenze.

Abbiamo quindi rinominare l'indice e ordinare per ottenere il risultato desiderato

UPDATE

Questo può anche essere fatto utilizzando str.len anziché apply che dovrebbe scalare meglio:

In [41]: 
count = df['fruits'].str.split().str.len() 
count.index = count.index.astype(str) + ' words:' 
count.sort_index(inplace=True) 
count 

Out[41]: 
0 words: 2 
1 words: 1 
2 words: 3 
3 words: 4 
4 words: 2 
5 words: 1 
Name: fruits, dtype: int64 

Orari

In [42]: 
%timeit df['fruits'].str.split().apply(len).value_counts() 
%timeit df['fruits'].str.split().str.len() 

1000 loops, best of 3: 799 µs per loop 
1000 loops, best of 3: 347 µs per loop 

Per un 6K df:

In [51]: 
%timeit df['fruits'].str.split().apply(len).value_counts() 
%timeit df['fruits'].str.split().str.len() 

100 loops, best of 3: 6.3 ms per loop 
100 loops, best of 3: 6 ms per loop 
+0

Domanda veloce.Se parola ha più di 10 parole, l'uscita è così: 1 parole: 6324 10 parole: 5 11 parole: 3 12 parole: 1 13 parole: 1 15 parole: 1 16 parole: 2 19 parole: 1 2 parole: 9109 3 parole: 5323 4 parole: 2010 5 parole: 862 6 parole: 307 7 parole: 141 8 parole: 51 9 parole: 19 Come Selezionare per numero di parole da 1 a 19? – Sergei

+0

scambia l'ordine in modo da prima 'sort_index' e poi lancia in str:' count.sort_index (inplace = True) 'e poi' count.index = count.index.astype (str) + 'words:' ' – EdChum

+0

Grazie! Funziona alla grande! – Sergei

2

Si potrebbe usare str.count con spazio ' ' come delimitatore.

In [1716]: count = df['fruits'].str.count(' ').add(1).value_counts(sort=False) 

In [1717]: count.index = count.index.astype('str') + ' words:' 

In [1718]: count 
Out[1718]: 
1 words: 2 
2 words: 2 
3 words: 1 
4 words: 1 
Name: fruits, dtype: int64 

Tempi

str.count è marginalmente più veloce

Piccolo

In [1724]: df.shape 
Out[1724]: (6, 1) 

In [1725]: %timeit df['fruits'].str.count(' ').add(1).value_counts(sort=False) 
1000 loops, best of 3: 649 µs per loop 

In [1726]: %timeit df['fruits'].str.split().apply(len).value_counts() 
1000 loops, best of 3: 840 µs per loop 

Media

In [1728]: df.shape 
Out[1728]: (6000, 1) 

In [1729]: %timeit df['fruits'].str.count(' ').add(1).value_counts(sort=False) 
100 loops, best of 3: 6.58 ms per loop 

In [1730]: %timeit df['fruits'].str.split().apply(len).value_counts() 
100 loops, best of 3: 6.99 ms per loop 

Grande

In [1732]: df.shape 
Out[1732]: (60000, 1) 

In [1733]: %timeit df['fruits'].str.count(' ').add(1).value_counts(sort=False) 
1 loop, best of 3: 57.6 ms per loop 

In [1734]: %timeit df['fruits'].str.split().apply(len).value_counts() 
1 loop, best of 3: 73.8 ms per loop