You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas/NumPy高效统计DataFrame中逗号分隔Genre的出现次数?

问题描述

我有一个包含约10000行数据的Pandas DataFrame,前7行数据如下:

IDGenre
1Drama, Comedy
2Action, Science Fiction, Suspense
3Horror, Suspense
4Comedy
5Action, Drama, Sports
6Comedy, Science Fiction
7Drama

需要生成新的DataFrame或字典,统计每种Genre的出现次数,预期结果如下:

GenreCount
Drama3
Comedy3
Action2
Science Fiction2
Suspense2
Sports1

我已经通过for循环实现了功能,但数据量大时耗时较长,代码如下:

my_dict = {} 
for elem in df['Genre']:
    for genre in elem.split(','):
        if genre in my_dict:
            my_dict[genre] += 1
        else:
            my_dict[genre] = 1

希望了解是否可以通过NumPy或Pandas的内置函数实现更高效的需求。


高效实现方案

可以利用Pandas的向量化操作替代显式循环,大幅提升效率,代码简洁易维护:

方法一:分步实现

# 1. 拆分Genre列并展开为单列Series
genre_series = df['Genre'].str.split(', ', expand=True).stack()

# 2. 统计每个Genre的出现次数
genre_counts = genre_series.value_counts().reset_index()

# 3. 重命名列名匹配需求
genre_counts.columns = ['Genre', 'Count']

方法二:链式操作(更简洁)

genre_counts = (df['Genre']
                .str.split(', ', expand=True)
                .stack()
                .value_counts()
                .reset_index()
                .rename(columns={'index': 'Genre', 'count': 'Count'}))

代码说明

  • str.split(', ', expand=True):将每个Genre字符串按, 分割,展开为多列DataFrame,自动处理多Genre的情况。
  • stack():把多列数据堆叠为单列Series,自动忽略拆分后产生的空值(即单个Genre行的其他列NaN)。
  • value_counts():高效统计单列中每个元素的出现次数,默认按次数降序排列。
  • reset_index() + rename():将统计结果的索引转为列,并修改列名以匹配预期格式。

转成字典格式

如果需要字典类型的结果,可直接转换:

genre_count_dict = genre_counts.set_index('Genre')['Count'].to_dict()

效率优势

Pandas的内置方法基于底层C语言实现,避免了Python循环的性能开销,对于10000行数据,处理速度会比手动循环快数倍,同时代码更易读、易维护。

内容的提问来源于stack exchange,提问作者aleksandra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:25:48