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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:45:03