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

如何处理含多行值的脏CSV并转换为规整的Pandas DataFrame?

规整混乱CSV为结构化DataFrame

问题说明

我有一个格式混乱的CSV文件,截图如下:
CSV文件截图

希望得到结构规整的DataFrame,示例如下:

df = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Harry', 'Hermiona', 'James'],
    'surname': ['Potter', 'Granger', 'Bond'],
    'grade': ['excellent', 'fabulous', 'fantastic'],
    'info3': ['something', None, None]
})

我目前构思的实现逻辑是:在CSV中跨行查找对应值,除非该行的第一个值为数字(即新记录的起始行)。

实现代码

1. 读取原始CSV内容

先按行读取CSV,保留所有原始文本结构:

import pandas as pd

# 替换为你的CSV文件路径
with open('your_csv_file.csv', 'r', encoding='utf-8') as f:
    # 按行分割,过滤空行,每行按逗号拆分
    raw_lines = [line.strip().split(',') for line in f if line.strip()]

2. 跨行合并记录

按照首列为数字的规则识别新记录,合并后续行的字段:

target_fields = ['id', 'name', 'surname', 'grade', 'info3']
processed_records = []
current_record = {}

for line in raw_lines:
    # 判断是否是新记录的起始行(首元素为数字)
    if line[0].isdigit():
        # 先把上一条记录存入列表(如果存在)
        if current_record:
            processed_records.append(current_record)
        # 初始化新记录,填充id字段
        current_record = {'id': line[0]}
        # 处理当前行的其他字段
        for idx, value in enumerate(line[1:], 1):
            if value and idx < len(target_fields):
                current_record[target_fields[idx]] = value
    else:
        # 非起始行,补充当前记录的缺失字段
        for idx, value in enumerate(line):
            if value and (idx + 1) < len(target_fields):
                current_record[target_fields[idx + 1]] = value

# 加入最后一条未保存的记录
if current_record:
    processed_records.append(current_record)

3. 生成结构化DataFrame

将处理后的记录转换为符合要求的DataFrame:

# 生成DataFrame并按指定字段排序
result_df = pd.DataFrame(processed_records)[target_fields]
# 将id转为数值类型
result_df['id'] = pd.to_numeric(result_df['id'])

# 查看结果
print(result_df)

注意事项

  • 如果原始CSV的字段顺序和示例不同,只需调整target_fields列表的顺序即可
  • 代码会自动跳过空值,缺失的字段会填充为None,和示例格式一致
  • 确保CSV文件编码正确,若有乱码可调整encoding参数(如gbk)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:29:57