1. Pandas教程:如何用 str.split + explode 按分隔符将 DataFrame 行拆分成多行(实用示例)
场景与需求
本文聚焦于数据分析中常见的需求:一个 DataFrame 的某列含有以分隔符分隔的字符串,我们需要将每个分段展开为独立的行,同时保留原始行的其它列信息。此处的分隔符常见且简单,如竖线 |、逗号 , 等。通过 str.split 将原始字符串拆成列表,再通过 explode 将列表中的元素逐一扩展成多行,可以实现“将行拆分成多行”的效果。本文的核心示例即为这一组合方法的实操演练。为了便于检索,标题中的关键词也会在正文中反复出现,以提升 SEO 相关性。
在开始前,确保你的 DataFrame 结构清晰:需要拆分的列明确、其他列需要保持或复制到结果集。关键点包括分隔符的一致性、空值处理以及多级索引的对齐。接下来我们给出一个简单的原始数据示例来直观展示方法。
基础实现概览
核心思路是:先分割为列表,再用 explode 将列表元素“展开”为多行,最后在需要时重建布局。下列代码示例展示一个最小化的实现,适合作为快速验证。
import pandas as pd
# 原始数据:id 与以分隔符分割的字段
df = pd.DataFrame({
'order_id': [101, 102],
'tags': ['apple|banana|cherry', 'durian|fig']
})
# 1) 将字符串按 '|' 分割成列表
# 2) 将列表 explode 成多行
df_expanded = df.assign(tags=df['tags'].str.split('|')).explode('tags')
print(df_expanded)
输出将会是每个原始行对应的多行记录,原始列(order_id)随行复制,新列 tags 展开为单个元素。这个模式是数据分解与后续聚合分析的常用起点。
在实际场景中,你可能还需要对某些行的分割结果进行进一步处理,例如筛选出仅存在的标签、对多个分隔符进行兼容处理,或者将拆分后的值与其他维度进行连接分析。此处的核心能力仍然来自 str.split 与 explode 的组合。
为了直观验证方法,下面给出一个完整的小型演示,确保你能在本机复现该流程。
# 演示数据与结果对比(简化版)
df_demo = pd.DataFrame({
'order_id': [1, 2, 3],
'categories': ['A|B', 'C', 'D|E|F']
})
df_demo_expanded = df_demo.assign(categories=df_demo['categories'].str.split('|')).explode('categories')
print(df_demo_expanded)
此处的输出将显示每个订单对应的多行记录,categories 列逐行展开,其他列保持不变,便于后续的统计或聚合分析。
输出结构与数据质量要点
通过上述步骤,最终得到的 DataFrame 具有与原始 DataFrame 相同的列结构,只是在目标列上实现了多行展开。要点包括:确保分隔符一致、检查空值处理、确认索引是否需要重建以便于后续连接或聚合。
如果目标列存在缺失值,则在分割前需要进行处理,避免产生不可预知的 explode 行为。下面的示例展示了一个空值处理的版本。
# 处理空值情形:将 NaN 替换为 '',再分割并展开
df_nan = pd.DataFrame({'order_id':[201,202], 'tags':[None, 'x|y']})
df_nan_expanded = df_nan.assign(tags=df_nan['tags'].fillna('').str.split('|')).explode('tags')
print(df_nan_expanded)
通过该处理,空值不会破坏数据结构,而是被安全地转换为遍历为空的结果,从而保持分析的一致性。
2. 实战示例:将订单多标签数据按分隔符展开为多行
数据准备与目标
实际数据往往来自订单系统或日志,其中一个字段可能包含多项值。示例数据包括 order_id 与 items,这里 items 使用分隔符分隔。通过该方法可以把每个订单的多项商品拆分成多行,便于后续分析如统计商品出现频率、进行逐条处理等。
先改造一个小型示例,确保分隔符为 '|',并保持 id 的可追溯性。
完整实现与结果展示
import pandas as pd
df = pd.DataFrame({
'order_id': [1001, 1002],
'items': ['pencil|eraser', 'notebook|pen|stapler']
})
# 按分隔符拆分并展开多行
df_expanded = df.assign(items=df['items'].str.split('|')).explode('items')
print(df_expanded)
在 数据透视/聚合阶段,你可以基于 order_id 对展开后的行进行计数、统计或联合分析,得到更细颗粒度的洞察。
3. 进阶技巧与常见坑
空值、空字符串与分隔符异常
要点在于对 空值、空字符串 及异常分隔符的处理。默认情况下,str.split 对 NaN 返回 NaN,随后 explode 可能导致意外行为。因此,先对缺失值进行填充或在分割前做条件判断尤为关键。
此外,如果字段中包含连续分隔符或尾部分隔符,分割结果可能含有空字符串。此时可在 split 时使用参数 expand=False 或对结果进行 where 条件筛选。
df = pd.DataFrame({'id':[1,2], 'tags':['a||b', 'c|']})
# 去除空字符串项:先分割再过滤
s = df['tags'].str.split('|')
df_exp = df.assign(tags=s).explode('tags')
df_exp = df_exp[df_exp['tags'] != '']
print(df_exp)
性能与大数据集考虑
在大数据集上,逐行 explode 的操作可能会导致内存膨胀;分批处理或使用 dtype 优化、以及对中间结果的 缓存与迭代策略能提升性能。对于 百万级数据,考虑在分割时就进行分组统计,或利用分布式计算框架如 Dask 来扩展。


