Python中如何将pandas DataFrame列explode后堆叠或生成多层索引?
解决pandas explode genre列后重复数据且保留原始信息的方案
前置说明
该场景是典型的多值分隔列拆分后的结构化处理问题,以下提供两种符合需求的实现方案,都不会丢失原始genre列的内容,也不会产生无效重复数据。
方案1:多层索引存储拆分后分类(适配需要单行单分类的使用场景)
该方案既保留explode后单行对应单个genre分类的结构方便后续统计,又通过多层索引避免重复判定问题,所有原始字段完整保留。
操作代码如下:
import pandas as pd # 此处模拟和你数据集结构一致的原始数据 df = pd.DataFrame({ 'movie_id': [1, 2, 3], 'title': ['银河护卫队', '爱乐之城', '蜘蛛侠:英雄归来'], 'genre': ['Action,Adventure,Sci-Fi', 'Comedy,Drama,Romance', 'Action,Adventure,Sci-Fi'], 'rating': [8.1, 8.3, 7.4] }) # 1. 备份原始genre列,确保原始信息不丢失 df['original_genre'] = df['genre'] # 2. 拆分genre为列表后执行explode df['genre'] = df['genre'].str.split(',') exploded_df = df.explode('genre', ignore_index=False) # 3. 设置多层索引:第一层为原始记录的唯一标识(如movie_id或原行索引),第二层为拆分后的genre值 exploded_df = exploded_df.set_index(['movie_id', 'genre'])
方案优势:
- 所有原始字段100%保留,无信息损失
- 多层索引天然区分同一原始记录的不同分类,不会被判定为重复行
- 后续按genre筛选、聚合统计可直接通过索引操作,执行效率更高
方案2:单记录聚合存储(适配需要每行对应唯一原始记录的无重复场景)
如果不需要单行单分类的结构,直接在原始行内存储拆分后的genre信息即可,整个DataFrame完全无重复行。
操作代码如下:
# 方式A:将genre拆分为列表存在新列,保留原始genre列 df['split_genre'] = df['genre'].str.split(',') # 方式B:将genre拆分为多列存储,每列对应一个分类 genre_expand_cols = df['genre'].str.split(',', expand=True).add_prefix('genre_') df = pd.concat([df, genre_expand_cols], axis=1)
方案优势:
- 每行对应唯一原始记录,完全无重复数据
- 同时保留原始字符串、拆分列表、分列存储三种genre格式,适配不同的使用需求
已有explode重复数据的修复方法
如果你已经执行完explode产生了重复数据,可按维度去重:
- 完全相同的整行重复:直接执行
exploded_df = exploded_df.drop_duplicates() - 仅需去重「同一原始记录+同一genre」的重复行:执行
exploded_df = exploded_df.drop_duplicates(subset=['movie_id', 'genre'], keep='first')
内容的提问来源于stack exchange,提问作者Gabriel Zinato
相关产品推荐
相关产品推荐

