explode()是Pandas 0.25+处理“一单元格多值”转多行的标准解法,需先str.split()成列表再explode(),注意分隔符正则、空值处理及性能优化。

用 str.split() + explode() 是最直接的方法
从 Pandas 0.25 开始,explode() 成为处理“一单元格多值”转多行的标准解法。前提是先用 str.split() 把字符串切成分隔的列表,再让 explode() 展开成行。
常见错误是跳过 str.split() 直接对原始字符串 explode() —— 这会把每个字符当一个元素拆开(比如 "a,b" 变成 ['a', ',', 'b'])。
- 分隔符必须明确:用
str.split(',')、str.split(r'\s*;\s*')等,注意正则需加r''和regex=True(默认已开启) - 空值要提前处理:
na_action='ignore'可让explode()跳过NaN,否则报错 - 原列类型必须是
string或object;若为category或数值型,先astype(str)
df['tags'] = df['tags'].str.split(',')
df = df.explode('tags').reset_index(drop=True)
遇到嵌套分隔符或不规则空格怎么办
真实数据常有 "apple, banana; cherry" 或 "dog , cat , bird" 这类混合分隔符+多余空格。硬写多个 str.split() 链式调用易出错,推荐一步到位用正则。
- 统一用分号或逗号(含前后空格):用
str.split(r'[,;]\s*') - 忽略所有空白并按任意空白/标点分割:用
str.split(r'[\s,;]+') - 保留原始分隔符逻辑但清理空字符串:在
split()后加.map(lambda x: [v.strip() for v in x if v.strip()])
示例:
df['ingredients'] = df['ingredients'].str.split(r'[,;]\s*').map(
lambda x: [v.strip() for v in x if v.strip()]
)
df = df.explode('ingredients')
性能差?大表慎用 explode() 的隐式复制
explode() 会复制整行数据,若原表 10 万行、某列平均拆出 5 个值,结果就是 50 万行——内存和速度都可能陡增。
- 先估算膨胀率:
df['col'].str.count(',').add(1).mean()看平均拆几行 - 避免对全表重复
explode():只对目标列做str.split().explode(),再用join()回原表 - 超大数据(千万级)考虑用
itertools.chain手动展开,绕过 Pandas 内部拷贝
手动展开片段:
from itertools import chain
splits = df['col'].str.split(',')
new_rows = list(chain.from_iterable(splits))
index_map = df.index.repeat(splits.str.len())
result = pd.DataFrame({'col': new_rows}, index=index_map)
旧版 Pandas(explode() 怎么办
只能靠 apply(pd.Series) + stack() 组合,但语法绕、易丢索引、且不支持 na_action。
- 必须确保
split()返回列表,空值填[np.nan]否则Series构造失败 -
stack()默认会把层级索引压平,需用reset_index(drop=True)清理 - 列名丢失,需手动重命名,且不能保留原 DataFrame 其他列(得额外
join)
示例(不推荐,仅兼容):
tmp = df['col'].str.split(',').apply(pd.Series).stack()
tmp.index = tmp.index.droplevel(-1)
df_new = pd.DataFrame({'col': tmp}).reset_index(drop=True)
真正麻烦的不是写法,而是这种写法在空值、长度不一致、非字符串类型上极易静默出错——升级 Pandas 是更省心的选择。
最常被忽略的是分隔符本身出现在值里的情况,比如 CSV 中的 "a,\"b,c\",d"。这时候 str.split() 就不可靠,得换 csv 模块解析后再进 Pandas。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











