2016-05-27 9 views
5

Załóżmy, że mamy prostą DataframeJak obliczyć liczbę słów w łańcuchu w DataFrame?

df = pd.DataFrame(['one apple','banana','box of oranges','pile of fruits outside', 'one banana', 'fruits']) 
df.columns = ['fruits'] 

jak obliczyć liczbę słów kluczowych, podobnych do:

1 word: 2 
2 words: 2 
3 words: 1 
4 words: 1 

Odpowiedz

7

IIUC następnie można wykonać następujące czynności:

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 

Tutaj użyj wektorowanego str.split, aby podzielić na spacje, a następnie applylen, aby uzyskać liczbę ementów, możemy następnie wywołać value_counts w celu zagregowania liczby częstotliwości.

Następnie zmień nazwę indeksu i sortować je, aby uzyskać pożądany wynik

UPDATE

Można to również zrobić za pomocą str.len zamiast apply które powinny przeskalować lepiej:

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 

Czas

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 

Dla 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

Szybkie pytanie.Jeśli słowo kluczowe zawiera więcej niż 10 słów, wyjście jest tak jak: 1 słowa: 6324 10 słowa: 5 11 słów: 3 12 słów: 1 13 słów: 1 15 słów: 1 16 słów: 2 19 słowa: 1 2 słów: 9109 3 słów: 5323 4 słów: 2010 5 słów: 862 6 słów: 307 7 słów: 141 8 słowa: 51 9 słowa: 19 Sposób sortowania liczby słów od 1 do 19? – Sergei

+0

zamień kolejność tak, aby najpierw "sort_index", a następnie rzutuj na str: 'count.sort_index (inplace = True)', a następnie 'count.index = count.index.astype (str) + 'words:'' – EdChum

+0

Dzięki! Działa świetnie! – Sergei

2

Można użyć str.count przestrzeni ' ' jako ogranicznik.

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 

Timings

str.count jest nieznacznie szybszy

Mały

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 

Średni

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 

Duży

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