Pandas基于多列逗号分隔字符串扩展DataFrame行的实现方法
Pandas 多列分隔值对齐扩展行方案
可直接运行的实现代码
import pandas as pd import numpy as np # 示例数据 data = {'ID':['P39','S32'], 'Name':['Pipe','Screw'], 'Col3':['Test1, Test2, Test3','Test6, Test7'], 'Col4':['','Test8, Test9'], 'Col5':['Test4, Test5','Test10, Test11, Test12, Test13'] } df = pd.DataFrame(data) # 核心处理逻辑 split_cols = ['Col3', 'Col4', 'Col5'] # 按分隔符拆分所有目标列 split_data = df[split_cols].apply(lambda col: col.str.split(', ')) # 计算每行需要扩展的行数:取三列拆分值数量的最大值 expand_counts = split_data.apply(lambda row: max(len(item) for item in row), axis=1) # 固定列按扩展行数复制 result = df[['ID', 'Name']].loc[df.index.repeat(expand_counts)].reset_index(drop=True) # 逐列对齐填充拆分值,长度不足补空字符串 for col in split_cols: aligned_vals = np.concatenate([ val_list + [''] * (count - len(val_list)) for val_list, count in zip(split_data[col], expand_counts) ]) result[col] = aligned_vals
逻辑说明
- 避免逐行
iterrows()+循环拼接DataFrame的低效写法,用pandas原生的行复制、numpy数组合并实现,万行级数据处理速度比循环写法快两个数量级 - 先统一拆分所有需要处理的列,再逐行计算扩展行数,逻辑清晰易维护
- 对拆分后长度不足的列表,直接在尾部补空字符串对齐长度,再展平为一维数组直接赋值给结果列,不需要逐单元格赋值
- 自动兼容空字符串单元格:空字符串拆分后得到长度为1的
[''],补值逻辑会自动处理后续空位,不需要额外写判断分支
输出结果
运行代码后得到的7行结果完全匹配需求:
ID Name Col3 Col4 Col5 0 P39 Pipe Test1 Test4 1 P39 Pipe Test2 Test5 2 P39 Pipe Test3 3 S32 Screw Test6 Test8 Test10 4 S32 Screw Test7 Test9 Test11 5 S32 Screw Test12 6 S32 Screw Test13
原有未完成代码的坑点
- 每次循环新建DataFrame再做
pd.concat()会频繁触发内存拷贝,数据量稍大就会卡顿 - 空字符串执行
split(', ')会返回['']而非空列表,直接按索引取值会导致空行错位 - 逐单元格用
iloc赋值的效率远低于数组整体赋值
内容的提问来源于stack exchange,提问作者PyGuy66
相关产品推荐
相关产品推荐

