如何使用pandas将CSV中无固定分隔符的杂乱列拆分为多行
非结构化CSV列拆分转行的实现方案
核心思路:目标列内容为类键值对格式但存在格式不规范问题,无需硬拆分隔符,改用正则匹配提取键和对应值段的方式处理即可,具体步骤和实现代码如下:
- 第一步:正常读取CSV数据,先拆分出无需处理的普通行(比如示例里的x、v行,值为纯数字无键标识),保留原始行的索引用于后续排序
- 第二步:对包含非结构化键值的行(比如示例里的y行),用正则分别匹配v1、v2列的所有键名,取两个相邻键名之间的内容作为对应键的值
- 第三步:把提取到的键值对转成独立行,和之前保留的普通行合并后调整顺序即可得到目标结果
import pandas as pd import re # 1、读取CSV,这里假设原文件分隔符为|,可根据实际情况调整读取参数 df = pd.read_csv('你的文件路径.csv', sep='|', skiprows=[1]) # skiprows跳过分隔线行 # 去除所有字段前后的多余空格 df = df.apply(lambda x: x.str.strip() if x.dtype == 'object' else x) df.columns = df.columns.str.strip() # 2、定义键值对提取函数,可根据实际数据格式调整正则规则 def extract_kv(s): # 先补全常见格式错误(比如示例里缺引号的问题,可按需增删规则) s = re.sub(r',\s*([A-Za-z])"', r', "\1"', s) # 匹配所有键名,规则为"键":,如果键名包含数字/大写可调整正则匹配范围 keys = re.findall(r'"([a-z]+)":', s) if not keys: return [] # 按键名拆分字符串,提取每个键对应的值段 parts = re.split(r'"[a-z]+":', s)[1:] kv_pairs = [] for k, v in zip(keys, parts): # 清理值段前后多余的逗号、空格 v = v.strip().rstrip(',').strip() kv_pairs.append((k, v)) return kv_pairs # 3、逐行处理数据 res_rows = [] for idx, row in df.iterrows(): v1_kv = extract_kv(row['v1']) v2_kv = extract_kv(row['v2']) # 无键值对的普通行直接保留 if not v1_kv and not v2_kv: res_rows.append({'原始行索引': idx, 'v1': row['v1'], 'v2': row['v2']}) continue # 键值对拆成独立行,默认两列键一一对应,不匹配的话可自行加对齐逻辑 for (k1, v1_val), (k2, v2_val) in zip(v1_kv, v2_kv): res_rows.append({'原始行索引': idx, '新行键': k1, 'v1': v1_val, 'v2': v2_val}) # 4、转成DataFrame输出,不需要的列可自行删除 res_df = pd.DataFrame(res_rows) print(res_df)
提示:如果实际数据里v1和v2的键存在不对应的情况,可以先提取两列键的并集做对齐,缺失值填充为空即可;正则规则可以根据你实际的键名、值格式灵活调整。
内容的提问来源于stack exchange,提问作者Kowen
相关产品推荐
相关产品推荐

