循环写入Pandas DataFrame至CSV遇表头不一致问题求助
解决Pandas循环写入CSV时表头不一致的问题
我太懂你这困扰了——循环追加结构不一样的DataFrame到CSV时,要么重复输出表头,要么因为列不匹配导致数据错位,完全不是预期的结果。下面给你一套实用的解决方案:
核心思路
先统一所有DataFrame的列结构(补全缺失列),再控制表头只在第一次写入时输出,从根源上解决重复表头和数据错位的问题。
步骤1:统一所有DataFrame的列
首先收集所有DataFrame里出现过的列名,然后让每个DataFrame都对齐这些列,缺失的列用NaN(或者你指定的默认值)填充:
import os import pandas as pd def write_csv(data): # 收集所有可能的列名 all_columns = set() for df in data.values(): all_columns.update(df.columns.tolist()) # 排序保证列顺序固定(可选但建议,避免列乱序) all_columns = sorted(all_columns) for meal_type, df in data.items(): filename = f"{meal_type}_mydf.csv" # 对齐列:补全缺失的列,缺失值默认NaN,也可以用fill_value=0指定填充值 df_aligned = df.reindex(columns=all_columns) # 判断文件是否已存在,决定是否写入表头 file_exists = os.path.exists(filename) # 写入CSV:mode='a'实现追加,header=not file_exists确保表头只写一次 df_aligned.to_csv(filename, mode='a', header=not file_exists, index=False)
实际效果演示
假设你的data字典里有两个结构不一致的DataFrame:
# 第一个完整的DF df1 = pd.DataFrame({ "Name": ["Peter"], "Meal": ["Lunch"], "22-03-18": [12], "23-03-18": [10], "25-03-18": [9] }) # 第二个缺失日期列的DF df2 = pd.DataFrame({ "Name": ["Alice"], "Meal": ["Lunch"], "22-03-18": [8], "23-03-18": [7] }) data = {"lunch": df1, "lunch": df2} # 模拟你的data结构
运行函数后,lunch_mydf.csv会生成如下内容:
Name,Meal,22-03-18,23-03-18,25-03-18 Peter,Lunch,12,10,9 Alice,Lunch,8,7,
缺失的25-03-18列会留空(对应NaN),表头也只会出现一次,完美对齐。
额外优化提示
- 如果不想用
NaN填充缺失值,可以在reindex时加上fill_value=0(或者其他你需要的默认值)。 - 加上
index=False是避免把Pandas的索引列写入CSV,不然会多一列无用数据。 - 如果你希望列的顺序不是排序后的,可以手动指定
all_columns的顺序,比如把固定列(Name, Meal)放在前面,日期列按时间排序。
内容的提问来源于stack exchange,提问作者AmiB
相关产品推荐
相关产品推荐

