Pandas合并不同形状DataFrame:添加自定义首行并消除多余空值
解决方案:在Pandas DataFrame前添加自定义首行并消除多余空值
问题说明
需要在Pandas DataFrame(df1)前添加一行自定义内容(格式为HEADER|日期|前一日日期),忽略原DataFrame表头,但使用concat合并后导出CSV时,首行末尾出现多余空值,不符合预期格式:
- df1结构:
A B C D E F G H 0 ABC1234 123 abc 45 64 34 Aruna 67044 1 DEF2344 345 red 34 43 56 Jason 83234 - 自定义首行:
'HEADER|'+ str(ODATE) + '|' + str(ODATE-datetime.timedelta(days=1)) - 当前导出结果(首行多余空值):
HEADER|20221008|20221007||||||||
ABC1234|123|abc|45|64|34|Aruna|67044
DEF2344|345|red|34|43|56|Jason|83234 - 期望导出结果:
HEADER|20221008|20221007
ABC1234|123|abc|45|64|34|Aruna|67044
DEF2344|345|red|34|43|56|Jason|83234
问题原因
原代码将自定义首行字符串转为Series后与df1拼接,由于Series仅1个元素,而df1有8列,拼接后首行其余列自动填充NaN,导出CSV时这些NaN被转为空值,导致首行末尾出现多余的||||||||。
解决方法
直接通过文件操作分两步写入:先写入自定义首行,再追加df1的内容,无需使用concat。
修正后代码
import pandas as pd from datetime import datetime, timedelta # 示例日期定义 ODATE = datetime(2022, 10, 8) final_output_file = "output.csv" # 生成格式化后的自定义首行 header_line = f'HEADER|{ODATE.strftime("%Y%m%d")}|{(ODATE - timedelta(days=1)).strftime("%Y%m%d")}' # 第一步:写入首行到文件 with open(final_output_file, 'w', encoding='utf-8') as f: f.write(header_line + '\n') # 第二步:追加df1内容,忽略原表头和索引 df1.to_csv(final_output_file, mode='a', index=False, sep='|', header=False)
代码说明
- 用
strftime格式化日期,确保输出为YYYYMMDD格式,避免datetime对象直接转字符串带来的多余字符 - 先以写入模式打开文件,写入自定义首行并换行
- 用
mode='a'以追加模式写入df1,同时指定header=False忽略原表头,index=False不写入索引
这种方法避开了Pandas拼接时的列数匹配问题,直接生成符合要求的CSV格式。
内容的提问来源于stack exchange,提问作者Lakshmi Sudarsanam
相关产品推荐
相关产品推荐

