计算 Pandas 中一列字符串中的单词数

Count words in a column of strings in Pandas

我有一个 pandas 数据框,其中包含给定时间段内的查询和计数,我希望将此数据框转换为唯一单词的计数。例如,如果数据框包含以下内容:

query          count
foo bar        10
super          8 
foo            4
super foo bar  2

我希望收到以下数据帧。例如'foo' 这个词在 table 中恰好出现了 16 次。

word    count
foo     16
bar     12
super   10

我正在使用以下函数,但这似乎不是执行此操作的最佳方法,而且它忽略了每行的总计数。

def _words(df):
  return Counter(re.findall(r'\w+', ' '.join(df['query'])))

任何帮助将不胜感激。

提前致谢!

选项 1

df['query'].str.get_dummies(sep=' ').T.dot(df['count'])

bar      12
foo      16
super    10
dtype: int64

选项 2

df['query'].str.get_dummies(sep=' ').mul(df['count'], axis=0).sum()

bar      12
foo      16
super    10
dtype: int64

选项 3
numpy.bincount + pd.factorize
还强调了 cytoolz.mapcat 的使用。它 returns 一个迭代器,它映射一个函数并连接结果。这很酷!

import pandas as pd, numpy as np, cytoolz

q = df['query'].values
c = df['count'].values

f, u = pd.factorize(list(cytoolz.mapcat(str.split, q.tolist())))
l = np.core.defchararray.count(q.astype(str), ' ') + 1

pd.Series(np.bincount(f, c.repeat(l)).astype(int), u)

foo      16
bar      12
super    10
dtype: int64

选项 4
荒谬的使用东西...只需使用选项 1。

pd.DataFrame(dict(
    query=' '.join(df['query']).split(),
    count=df['count'].repeat(df['query'].str.count(' ') + 1)
)).groupby('query')['count'].sum()

query
bar      12
foo      16
super    10
Name: count, dtype: int64

melt+groupby+sum的另一种选择:

df['query'].str.split(expand=True).assign(count=df['count'])\
                          .melt('count').groupby('value')['count'].sum()

value
bar      12
foo      16
super    10
Name: count, dtype: int64