计算列表中主题标签的性能方法(pandas)
我有一个包含约 7.000.000 行和很多列的数据框。
每一行都是一条推文,我有一列包含推文内容的文本。
我仅为文本内的主题标签创建了一个新列:
df['hashtags'] = df.Tweets.str.findall(r'(?:(?<=\s)|(?<=^))#.*?(?=\s|$)')
所以我有一个名为 hashtags 的列,每行包含一个列表结构:['#b747', '#test']
。
我想计算每个主题标签的数量,但我有大量的行。最有效的方法是什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
以下是一些不同的方法,以及时间,按速度排序(最快的第一个):
结论:最快的是#1(使用
Counter(chain(*df.hashtags))
),但更直观自然#2(来自@Psidom 评论)几乎一样快。我可能会同意。 #6(@EzerK 方法)对于大型df
来说非常慢,因为我们在将其作为参数传递给Counter()
之前正在构建一个新的(长)列表。Here are some different approaches, along with timing, ordered by speed (fastest first):
Conclusion: the fastest is #1 (using
Counter(chain(*df.hashtags))
), but the more intuitive and natural #2 (from @Psidom comment) is almost as fast. I would probably go with that. #6 (@EzerK approach) is very slow for largedf
slow because we are building a new (long) list before passing it as argument toCounter()
.您可以将所有列表合并为一个大列表,然后使用 collections.Counter:
you can all the lists to one big list and then use collections.Counter:
尝试了 Pierre 答案中的解决方案 1、2 和 3,因为它们的性能最高,而且我想要一两行代码。另外,我希望获得每条推文(即每行)的主题标签计数,而不是数据集中使用的所有不同主题标签(包括其频率计数)的字典。我对皮埃尔建议的所有努力和不同方法投了赞成票。
不幸的是,对于我使用的 Twitter 数据,解决方案 1、2 和 3 都返回 NaN。还尝试了建议的 tweets_df.Tweets.str.extractall(r'(\#\w+)')[0].value_counts() 的不同变体/questions/49865756/extract-and-count-hashtags-from-a-dataframe">此处 但它们都不起作用。
最终起作用的是这两行在
性能方面,提取主题标签的代码使用更少的时间:
Tried solutions 1, 2 and 3 from Pierre's answer as they are most performant and I wanted one or two lines of code. Also I wanted to have the count of hashtags per tweet, i.e. per row, and not a dictionary of all the different hashtags used in the dataset including their frequency count. An up-vote from me for all the effort and different methods Pierre suggests.
Unfortunately, solutions 1, 2 and 3 all returned NaNs for the Twitter data I work with. Also tried different variants of
tweets_df.Tweets.str.extractall(r'(\#\w+)')[0].value_counts()
suggested here but none of them worked.What worked in the end are these two lines
On the note of performance, this code to extract hashtags uses less time: