You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于条件合并CSV拆分行:使用Pandas修复多行拆分数据

解决方案:用Pandas合并被错误拆分的CSV行

核心思路

通过分组标识将属于同一原始行的多行数据归为一组,再对每组内的列按类型分别处理:文本列拼接空格(还原被换行替代的空格),日期列保留组内第一个有效值,数值列合并后转换为正确格式。

具体实现步骤

  1. 读取CSV并处理空值
    确保空字符串被正确识别为NaN,方便后续判断分组:

    import pandas as pd
    
    # 读取CSV,将空字符串设为NaN,保留原始格式
    df1 = pd.read_csv("input.csv", sep=";", keep_default_na=False, na_values=[''])
    
  2. 生成分组ID
    以A列非空行为分组起点,为每一组分配唯一ID:

    # 每遇到A列有值的行,分组ID递增,同一原始行的多行将被归为同一组
    df1['group_id'] = df1['A'].notna().cumsum()
    
  3. 分组聚合合并数据
    自定义聚合函数,针对不同列的特性处理:

    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)
    
  4. 可选:还原小数逗号分隔格式
    如果需要将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 20:02:28