如何基于电影DataFrame的Genre集合实现多归属分组及聚合?
多类别电影DataFrame的分组方案(支持单电影归属多分组)
直接用groupby处理原DataFrame不是正确的选择,因为默认的groupby是基于每行的单一分组键来聚合的,没法让一部同时属于多个类别的电影出现在对应的多个分组里。不过我们可以先对数据做一步转换,之后再用groupby就能完美满足你的需求。
1. 先优化类别集合的提取(可选,但更高效)
你原来提取类别集合的代码可以用Pandas的字符串方法简化,不用手动循环:
# 直接拆分、展开所有类别并去重得到集合 gset = set(df['genres'].str.split(', ', expand=True).stack().unique())
这样代码更简洁,运行效率也更高,结果和你原来的方法完全一致。
2. 核心步骤:将多类别行拆分为多行
要实现"一部电影属于多个类别就出现在对应分组",关键是把每个电影的多个类别拆成独立的行,每个类别对应原电影的一条完整记录。用Pandas的explode方法就能轻松做到:
# 第一步:把逗号分隔的genres字符串转为列表 df['genres'] = df['genres'].str.split(', ') # 第二步:将列表拆分为多行,每个类别对应一行原数据 exploded_df = df.explode('genres')
这一步之后,exploded_df里每一行只对应一个类别,原来属于多个类别的电影会被复制成多行,分别对应它的每个类别。
3. 用groupby做聚合操作
现在就可以正常用groupby按genres列分组,执行你需要的聚合操作了。比如统计每个类别的电影数量、平均评分:
# 按类别分组并计算统计指标 genre_agg = exploded_df.groupby('genres').agg( total_movies=('title', 'nunique'), # 统计每个类别的独特电影数 avg_rating=('rating', 'mean') # 计算每个类别的平均评分 ).reset_index() # 查看结果,会包含所有24个类别 print(genre_agg)
为什么直接用原DataFrame的groupby不行?
如果直接对原DataFrame的genres列做groupby,它会把整个逗号分隔的字符串当成一个分组键(比如"Action, Drama"会被视为一个单独的分组),而不是把电影分到Action和Drama两个分组里,完全不符合你"一部电影出现在多个分组"的需求。
这种拆分后再分组的方式,完美解决了你的两个需求:既可以正常执行聚合操作,又能保证每个电影出现在所有它所属的类别分组中,完全消除数据收集阶段的排序或标记偏差。
内容的提问来源于stack exchange,提问作者sandeepmohan
相关产品推荐
相关产品推荐

