如何合并列名不同的DataFrame,导出CSV时避免NaN产生的多余逗号
解决方案
方案1:分别写入同一文件(无需合并,无冗余逗号)
如果不需要统一的表头,直接将两个DataFrame按顺序追加写入同一个CSV即可,不会产生多余的NaN空值和逗号:
import pandas as pd xyarr= [[0,1,2],[1,1,3],[2,1,2]] df1 = pd.DataFrame(xyarr, columns=['a', 'b','c']) df2 = pd.DataFrame([['text','text2']], columns=['x','y']) # 写入第一个DataFrame,带表头 df1.to_csv("output.csv", index=False) # 追加写入第二个DataFrame,不重复写表头 df2.to_csv("output.csv", index=False, header=False, mode="a")
导出效果:
a,b,c 0,1,2 1,1,3 2,1,2 x,y text,text2
方案2:合并后清理尾部空逗号
如果必须保留concat合并后的完整表头结构,可以在导出后清理每行尾部的空值对应的多余逗号:
import pandas as pd import csv xyarr= [[0,1,2],[1,1,3],[2,1,2]] df1 = pd.DataFrame(xyarr, columns=['a', 'b','c']) df2 = pd.DataFrame([['text','text2']], columns=['x','y']) df3 = pd.concat([df1,df2],axis=0, ignore_index=True) # 先导出为临时文件,NaN替换为空字符串 df3.to_csv("temp.csv", index=False, na_rep="") # 逐行清理尾部空值后写入最终文件 with open("temp.csv", "r", encoding="utf-8") as f_in, open("output.csv", "w", encoding="utf-8", newline="") as f_out: reader = csv.reader(f_in) writer = csv.writer(f_out) for row in reader: # 移除行尾连续空值 while row and row[-1] == "": row.pop() writer.writerow(row)
导出效果(第一行为完整合并表头):
a,b,c,x,y 0.0,1.0,2.0 1.0,1.0,3.0 2.0,1.0,2.0 text,text2
方案3:列映射后合并(适合列有对应关系的场景)
如果两个DataFrame的列存在实际对应关系,可重命名列后合并,不会产生NaN和多余逗号:
import pandas as pd xyarr= [[0,1,2],[1,1,3],[2,1,2]] df1 = pd.DataFrame(xyarr, columns=['a', 'b','c']) df2 = pd.DataFrame([['text','text2']], columns=['x','y']) # 重命名df2列名和df1对齐,缺失的列补空值 df2_aligned = df2.rename(columns={"x":"a", "y":"b"}).reindex(columns=df1.columns, fill_value="") df3 = pd.concat([df1, df2_aligned], axis=0, ignore_index=True) df3.to_csv("output.csv", index=False)
导出效果:
a,b,c 0,1,2 1,1,3 2,1,2 text,text2,
内容的提问来源于stack exchange,提问作者Epsilon Eridani
相关产品推荐
相关产品推荐

