保留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 手动处理(小数据量)
如果数据行数不多,可以用公式快速拆分:
- 在新工作表中,第一行手动输入表头:
id、road_name、length、type - 在A2单元格输入公式(假设原始数据在Sheet1):
=INDEX(Sheet1!$A:$A, INT((ROW()-2)/4)+2),用于重复填充id - 在B2输入:
=INDEX(Sheet1!$B:$N, INT((ROW()-2)/4)+2, MOD(ROW()-2,4)*3+1),提取road_name - 同理,C2输入:
=INDEX(Sheet1!$B:$N, INT((ROW()-2)/4)+2, MOD(ROW()-2,4)*3+2),提取length - D2输入:
=INDEX(Sheet1!$B:$N, INT((ROW()-2)/4)+2, MOD(ROW()-2,4)*3+3),提取type - 下拉填充公式后,过滤掉空值行即可
内容的提问来源于stack exchange,提问作者JUNGLE
相关产品推荐
相关产品推荐

