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

保留ID列不变,将CSV中重复列名对应数据拆分至新行

处理重复列名的CSV行拆分问题

我有一个包含重复列名(如road_name、length、type多次重复)的CSV文件,需要把这些重复列对应的数据拆分成独立行,同时保持id字段不变——原本应该是独立行的内容被放在了同一行的末尾。

输入示例

id,road_name,length,type,road_name,length,type,road_name,length,type,road_name,length,type
1,r22,22,c,r16,16,a,r17,13,a,r77,13,c
2,r16,5,c,,,,,,,,,
3,r12,7,a,r9,12,c,r3,5,c,,,

期望输出

id,road_name,length,type
1,r22,22,c
1,r16,16,a
1,r17,13,a
1,r77,13,c
2,r16,5,c
3,r12,7,a
3,r9,12,c
3,r3,5,c

解决方向指引

1. Python + Pandas 实现(最灵活)

这是处理这类结构化数据的首选方案,步骤清晰且扩展性强:

  • 读取CSV时,利用mangle_dupe_cols=True自动给重复列加后缀(如road_name.0、road_name.1)
  • 遍历每一行,按3列一组(road_name/length/type)提取有效数据,绑定对应的id
  • 过滤空值行后重新生成目标CSV

示例代码:

import pandas as pd

# 读取带重复列的CSV
df = pd.read_csv('input.csv', mangle_dupe_cols=True)
# 存储拆分后的行数据
new_rows = []

for _, row in df.iterrows():
    # 每3个字段为一组,从第2个字段开始遍历
    for group_idx in range(4):
        rn_col = f'road_name.{group_idx}'
        ln_col = f'length.{group_idx}'
        tp_col = f'type.{group_idx}'
        # 跳过不存在的列或空值
        if rn_col not in df.columns:
            break
        rn, ln, tp = row[rn_col], row[ln_col], row[tp_col]
        if pd.notna(rn) and pd.notna(ln) and pd.notna(tp):
            new_rows.append({
                'id': row['id'],
                'road_name': rn,
                'length': ln,
                'type': tp
            })

# 生成结果并保存
result_df = pd.DataFrame(new_rows)
result_df.to_csv('output.csv', index=False)

2. 命令行 Awk 处理

适合快速处理无需复杂逻辑的场景,直接通过字段索引拆分:

BEGIN {
    FS = ","
    OFS = ","
    print "id,road_name,length,type"
}
NR > 1 {
    record_id = $1
    # 从第2个字段开始,每3个字段为一组
    for (i = 2; i <= NF; i += 3) {
        rn = $i
        ln = $(i+1)
        tp = $(i+2)
        # 跳过空值组
        if (rn != "" && ln != "" && tp != "") {
            print record_id, rn, ln, tp
        }
    }
}

运行方式:将上述代码保存为split_csv.awk,执行 awk -f split_csv.awk input.csv > output.csv

3. Excel/Google Sheets 手动处理(小数据量)

如果数据行数不多,可以用公式快速拆分:

  1. 在新工作表中,第一行手动输入表头:id、road_name、length、type
  2. 在A2单元格输入公式(假设原始数据在Sheet1):=INDEX(Sheet1!$A:$A, INT((ROW()-2)/4)+2),用于重复填充id
  3. 在B2输入:=INDEX(Sheet1!$B:$N, INT((ROW()-2)/4)+2, MOD(ROW()-2,4)*3+1),提取road_name
  4. 同理,C2输入:=INDEX(Sheet1!$B:$N, INT((ROW()-2)/4)+2, MOD(ROW()-2,4)*3+2),提取length
  5. D2输入:=INDEX(Sheet1!$B:$N, INT((ROW()-2)/4)+2, MOD(ROW()-2,4)*3+3),提取type
  6. 下拉填充公式后,过滤掉空值行即可

内容的提问来源于stack exchange,提问作者JUNGLE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:50:25