我有一个包含字符串的pandas列。我想得到整个专栏中所有单词的字数。如果没有循环遍历每个值,最好的方法是什么?
df = pd.DataFrame({'a': ['some words', 'lots more words', 'hi']})
在df['a']
上运行时,你应该得到6
答案 0 :(得分:6)
您可以使用vectorized string operations:
In [8]: df["a"].str.split()
Out[8]:
0 [some, words]
1 [lots, more, words]
2 [hi]
Name: a, dtype: object
In [9]: df["a"].str.split().str.len()
Out[9]:
0 2
1 3
2 1
Name: a, dtype: int64
In [10]: df["a"].str.split().str.len().sum()
Out[10]: 6
来自
// print_char(n,c) prints c n-times.
void print_char(int n, char c) {
for (int i = 0; i < n; ++i) {
printf("%c", c);
}
}
答案 1 :(得分:5)
使用cat
字符串方法的另一个选项。我们将所有字符串粉碎在一起然后拆分并计算
len(df["a"].str.cat(sep=' ').split())
精心制作的测试数据
li = [
'Lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur',
'adipiscing', 'elit', 'Integer', 'et', 'tincidunt', 'nisl',
'Sed', 'pretium', 'arcu', 'nec', 'est', 'hendrerit',
'vestibulum', 'Curabitur', 'a', 'nibh', 'justo', 'Praesent',
'non', 'pellentesque', 'enim', 'ac', 'nulla', 'ut', 'mi',
'diam', 'Aenean', 'placerat', 'ante', 'euismod', 'pulvinar',
'augue', 'purus', 'ornare', 'erat', 'pharetra', 'mauris',
'sapien', 'vitae', 'In', 'id', 'velit', 'quis', 'mattis',
'condimentum', 'Cras', 'congue', 'neque', 'faucibus', 'nisi',
'tempor', 'eget', 'Etiam', 'semper', 'Nulla', 'elementum',
'magna', 'Donec', 'vel', 'ex', 'dictum', 'Aliquam', 'lobortis',
'rutrum', 'ligula', 'Vivamus', 'eu', 'eros', 'Morbi', 'blandit',
'rhoncus', 'consequat', 'orci', 'convallis', 'finibus', 'lorem',
'urna', 'molestie', 'in', 'sed', 'luctus', 'Ut', 'imperdiet',
'felis', 'Mauris', 'nunc', 'malesuada', 'lacinia', 'Vestibulum',
'bibendum', 'risus', 'tortor', 'sollicitudin', 'aliquam',
'primis', 'ultrices', 'posuere', 'cubilia', 'Curae',
'Phasellus', 'turpis', 'auctor', 'venenatis', 'Pellentesque',
'fermentum', 'accumsan', 'maximus', 'Fusce', 'ultricies',
'tristique', 'sodales', 'suscipit', 'sagittis', 'at', 'cursus',
'Nullam', 'dui', 'fringilla', 'mollis', 'Orci', 'varius',
'natoque', 'penatibus', 'magnis', 'dis', 'parturient', 'montes',
'nascetur', 'ridiculus', 'mus', 'facilisi', 'sem', 'viverra',
'feugiat', 'aliquet', 'lectus', 'porta', 'Nunc', 'facilisis',
'Duis', 'volutpat', 'scelerisque', 'Maecenas', 'tempus',
'massa', 'laoreet', 'gravida', 'odio', 'iaculis', 'libero',
'eleifend', 'leo', 'Quisque', 'ullamcorper', 'dignissim',
'interdum', 'vulputate', 'lacus', 'vehicula', 'Nam', 'commodo',
'dapibus', 'efficitur', 'tellus', 'Suspendisse', 'metus',
'Proin', 'quam', 'porttitor', 'egestas'
]
df = pd.DataFrame(
dict(a=[' '.join(
np.random.choice(li, np.random.randint(5, 10, 1))
) for _ in range(10000)]))
天真的测试结果
答案 2 :(得分:3)
df.a.str.extractall('(\w+)').count()[0]
这会在(\w+)
中的每个单元格中提取所有单词(与正则表达式a
匹配),并将它们放在一个看起来像这样的新框架中:
0
match
0 0 some
1 words
1 0 lots
1 more
2 words
2 0 hi
然后,您可以在行上执行count
以获取字数。
请注意,如果需要,您可以随时更改正则表达式。例如,如果某些单词可能包含标点符号,则可以将单词定义为任何一系列非空白字符,并执行以下操作:
df.a.str.extractall('(\S+)').count()[0]
而不是
编辑
如果您完全关心速度,请改用DSM的解决方案:
使用ipython %timeit
进行基本时间测试:
%timeit df.a.str.extractall('(\S+)').count()[0]
1000 loops, best of 3: 1.28 ms per loop
%timeit df["a"].str.split().str.len().sum()
1000 loops, best of 3: 447 µs per loop
答案 3 :(得分:1)
单词数量可以通过str count blanks + 1,然后sum()
获得(df.a.str.count(' ')+1).sum()