Python Pandas中带{}、|分隔的DataFrame列explode拆行方法
带
{}包裹、|分隔字段的DataFrame拆分多行实现 之前测试代码达不到预期的核心原因:单独处理列时,没有先剥离单元格内容里的{}包裹符,也没有兼容非格式类的普通单元格,直接对字符串做逐字符遍历切分,无法生成explode方法要求的列表结构,自然达不到预期效果。
核心处理思路
- 逐列定位所有带特殊格式的单元格:即同时被
{}包裹、内部用|分隔多值的单元格,对这类单元格做两步清洗:去掉首尾的花括号、按|切分成元素列表 - 统一单元格格式:对没有特殊格式的普通单元格,直接把原有值包装为单元素列表,保证和拆分后的单元格格式统一,不会触发格式报错
- 批量同步拆分:一次性对所有待拆分列调用pandas原生
explode方法,保证同一行的多列拆分值精准对齐,避免列错位 - 规整输出结构:拆分完成后重置索引,得到和预期完全一致的表格结构
可直接运行的完整代码
构建匹配描述的原始测试表
import pandas as pd df = pd.DataFrame({ "Name": [1, 2, 3], "gender": ["M", "F", "M"], "message_type": ["orange", "", "{red|blue}"], "code": ["103", "{102|777}", "983"] })
执行拆分逻辑
# 定义所有可能出现特殊分隔格式的列 target_split_cols = ["message_type", "code"] # 逐列做格式适配,将单元格内容转换为explode可识别的列表结构 for col in target_split_cols: df[col] = df[col].apply( lambda cell: ( cell.strip("{}").split("|") if isinstance(cell, str) and cell.startswith("{") and cell.endswith("}") else [cell] ) ) # 批量执行explode拆分 df_final = df.explode(target_split_cols).reset_index(drop=True)
最终输出结果
执行完成后得到的表格和预期效果完全一致:
Name gender message_type code 0 1 M orange 103 1 2 F 102 2 2 F 777 3 3 M red 983 4 3 M blue 983
常见踩坑提醒
- 不要只对单独一列做拆分:原始表中
message_type和code列都可能出现{}包裹的多值格式,如果只处理其中一列,会出现拆分后另外一列没有同步匹配行的错位问题 - 切分逻辑要针对单元格整体:你之前写的lambda逻辑是把字符串拆成单个字符再做切分,而不是对单元格整体内容做剥离、切分操作,自然生成不了正确的列表结构
- 拆分逻辑要加类型判断:如果列内存在非字符串类型的值(比如数字类型的code值),直接调用字符串方法会触发类型报错,加类型判断能兼容混合类型的列内容
内容的提问来源于stack exchange,提问作者brandon lee
相关产品推荐
相关产品推荐

