如何在Python Pandas中按DataFrame列内的列表值分组?
处理Pandas中含列表的genre列分组需求
嘿,这个场景我太熟悉了!当你的DataFrame里genre列是列表类型时,直接分组肯定得不到想要的结果——毕竟每个电影对应多个流派嘛。别担心,用Pandas的explode()方法就能轻松解决,我给你一步步拆解:
1. 先准备示例数据(你可以替换成自己的数据集)
首先咱们构造一个和你场景匹配的示例DataFrame,方便你对照理解:
import pandas as pd data = { 'title': ['星际穿越', '盗梦空间', '肖申克的救赎', '千与千寻'], 'genre': [['科幻', '冒险'], ['科幻', '悬疑'], ['剧情'], ['动画', '奇幻', '剧情']], 'rating': [9.4, 9.4, 9.7, 9.4] } df = pd.DataFrame(data)
2. 把genre列的列表拆成单独行
这是最关键的一步!用explode()方法把每个电影对应的多个流派拆成独立的行,这样每个行就只对应一个流派了:
# 展开genre列的列表,生成新的DataFrame exploded_df = df.explode('genre')
展开后的结果长这样:
| title | genre | rating |
|---|---|---|
| 星际穿越 | 科幻 | 9.4 |
| 星际穿越 | 冒险 | 9.4 |
| 盗梦空间 | 科幻 | 9.4 |
| 盗梦空间 | 悬疑 | 9.4 |
| 肖申克的救赎 | 剧情 | 9.7 |
| 千与千寻 | 动画 | 9.4 |
| 千与千寻 | 奇幻 | 9.4 |
| 千与千寻 | 剧情 | 9.4 |
3. 按genre分组并聚合统计
现在就可以像普通列一样分组了!比如统计每个流派的电影数量、平均评分:
# 分组后自定义聚合逻辑 genre_stats = exploded_df.groupby('genre').agg( 电影数量=('title', 'nunique'), # 用nunique避免同一电影多次计数 平均评分=('rating', 'mean') ).reset_index()
最终得到的统计结果:
| genre | 电影数量 | 平均评分 |
|---|---|---|
| 冒险 | 1 | 9.4 |
| 动画 | 1 | 9.4 |
| 奇幻 | 1 | 9.4 |
| 剧情 | 2 | 9.55 |
| 科幻 | 2 | 9.4 |
| 悬疑 | 1 | 9.4 |
额外小提示
如果你的genre列里存在空列表或者NaN值,可以在展开后加一步清理:
exploded_df = df.explode('genre').dropna(subset=['genre'])
这样就能避免无效的分组啦~
内容的提问来源于stack exchange,提问作者Sitabja
相关产品推荐
相关产品推荐

