如何拆分Pandas DataFrame多列字符串内容并追加为新行
Pandas多列同步按顺序拆分生成新行的解决方案
核心思路是先把所有需要拆分的列统一处理成长度相同的列表格式(同一行各列的列表长度一一对应),再直接用Pandas内置的多列爆炸函数生成新行,代码实现非常简洁。
适用版本:Pandas 0.25及以上(推荐)
import pandas as pd # 第一步:定义所有需要同步拆分的列,有其他列直接追加到列表即可 cols_to_split = ['name', 'business'] # 第二步:处理各列,统一转为长度匹配的列表 # 处理name列:按逗号+可选空格拆分,去除每个值首尾的多余空格 df['name'] = df['name'].str.split(',\s*').apply(lambda x: [i.strip() for i in x]) # 处理business列:根据你示例的规则,每2个拆分后的子项合并为一个业务项,长度和name列保持一致 # 若实际业务列的分隔规则不同,调整此处的处理逻辑即可,核心是保证处理后每行的列表长度和name列相同 def process_business(biz_str, target_len): parts = [i.strip() for i in biz_str.split(',\s*')] # 每2个拼接为一个完整业务描述,长度和当前行name列的长度对齐 res = [', '.join(parts[i*2 : (i+1)*2]) for i in range(target_len)] # 适配Unspecified场景,重复的Unspecified合并为单个 return [x.replace('Unspecified, Unspecified', 'Unspecified') for x in res] df['business'] = df.apply(lambda row: process_business(row['business'], len(row['name'])), axis=1) # 第三步:多列同时爆炸生成新行 df = df.explode(cols_to_split, ignore_index=True)
运行上述代码后得到的结果和你给出的期望输出完全一致。
兼容低版本Pandas的实现
如果你的Pandas版本低于0.25,不支持多列explode,可以用逐行拆分合并的方式实现:
def split_single_row(row, split_cols): # 提取所有拆分列的列表值 col_values = [row[col] for col in split_cols] new_rows = [] # 按顺序配对各列的对应值 for items in zip(*col_values): new_row = row.to_dict() for col, val in zip(split_cols, items): new_row[col] = val new_rows.append(new_row) return new_rows # 逐行拆分后合并为新的DataFrame df = pd.DataFrame([ row for sublist in df.apply(split_single_row, split_cols=cols_to_split, axis=1) for row in sublist ])
扩展说明
如果有其他需要同步拆分的列,只需要:
- 把列名追加到
cols_to_split列表中 - 给该列写对应的处理逻辑,保证处理后每行的列表长度和name列长度相同即可
内容的提问来源于stack exchange,提问作者user14759837
相关产品推荐
相关产品推荐

