如何用Pandas/NumPy高效统计DataFrame中逗号分隔Genre的出现次数?
问题描述
我有一个包含约10000行数据的Pandas DataFrame,前7行数据如下:
| ID | Genre |
|---|---|
| 1 | Drama, Comedy |
| 2 | Action, Science Fiction, Suspense |
| 3 | Horror, Suspense |
| 4 | Comedy |
| 5 | Action, Drama, Sports |
| 6 | Comedy, Science Fiction |
| 7 | Drama |
需要生成新的DataFrame或字典,统计每种Genre的出现次数,预期结果如下:
| Genre | Count |
|---|---|
| Drama | 3 |
| Comedy | 3 |
| Action | 2 |
| Science Fiction | 2 |
| Suspense | 2 |
| Sports | 1 |
我已经通过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
相关产品推荐
相关产品推荐

