基于条件合并CSV拆分行:使用Pandas修复多行拆分数据
解决方案:用Pandas合并被错误拆分的CSV行
核心思路
通过分组标识将属于同一原始行的多行数据归为一组,再对每组内的列按类型分别处理:文本列拼接空格(还原被换行替代的空格),日期列保留组内第一个有效值,数值列合并后转换为正确格式。
具体实现步骤
读取CSV并处理空值
确保空字符串被正确识别为NaN,方便后续判断分组:import pandas as pd # 读取CSV,将空字符串设为NaN,保留原始格式 df1 = pd.read_csv("input.csv", sep=";", keep_default_na=False, na_values=[''])生成分组ID
以A列非空行为分组起点,为每一组分配唯一ID:# 每遇到A列有值的行,分组ID递增,同一原始行的多行将被归为同一组 df1['group_id'] = df1['A'].notna().cumsum()分组聚合合并数据
自定义聚合函数,针对不同列的特性处理:def merge_group_rows(group): merged = {} # A列:取组内第一个非空日期(每组第一行是原始行开头) merged['A'] = group['A'].dropna().iloc[0] # 文本列(示例为B、C、D列):用空格拼接所有非空片段,还原被换行替代的空格 for col in ['B', 'C', 'D']: merged[col] = ' '.join(group[col].dropna().astype(str)) # 数值列(E、F列):合并所有非空片段,替换逗号为小数点后转数值 for col in ['E', 'F']: num_part = ''.join(group[col].dropna().astype(str)) merged[col] = float(num_part.replace(',', '.')) if num_part else None return pd.Series(merged) # 应用聚合函数,合并每组数据 df_merged = df1.groupby('group_id').apply(merge_group_rows).reset_index(drop=True)可选:还原小数逗号分隔格式
如果需要将E、F列的数值重新转为逗号分隔的字符串:df_merged[['E', 'F']] = df_merged[['E', 'F']].applymap( lambda x: f"{x:.2f}".replace('.', ',') if pd.notna(x) else x )
说明
- 分组ID的生成逻辑确保了所有属于同一原始行的拆分数据被归为一组,不会误合并不同行。
- 文本列用空格拼接,精准还原了被错误换行替代的空格。
- 数值列处理兼顾了可能被拆分的极端情况,同时保留了区域设置的逗号分隔格式需求。
内容的提问来源于stack exchange,提问作者Lyran
相关产品推荐
相关产品推荐

