如何处理含多行值的脏CSV并转换为规整的Pandas DataFrame?
规整混乱CSV为结构化DataFrame
问题说明
我有一个格式混乱的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
相关产品推荐
相关产品推荐

