Pandas列中所有字数的总和

时间:2017-03-25 16:58:19

标签: python pandas

我有一个包含字符串的pandas列。我想得到整个专栏中所有单词的字数。如果没有循环遍历每个值,最好的方法是什么?

df = pd.DataFrame({'a': ['some words', 'lots more words', 'hi']})

df['a']上运行时,你应该得到6

4 个答案:

答案 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)]))

天真的测试结果

enter image description here

答案 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()