如何逐行向CSV追加Pandas DataFrame行而非列?
解决Pandas逐行写入CSV的行/列、覆盖及表头问题
我来帮你搞定这个问题!你遇到的几个麻烦——数据写成列、每次覆盖之前内容、表头残留,其实都是逐行处理DataFrame时的几个小细节没处理好,咱们一步步调整代码:
问题根源拆解
- 覆盖文件而非追加:你用了
'w+'模式打开文件,每次循环都会清空文件重新写,最后只留下最后一行数据。得换成追加模式'a'。 - 一维列表转成了列数据:
pd.DataFrame(case_row)会把单个列表当成列来处理(因为一维数组默认是列方向),要把它改成二维列表[case_row],这样生成的就是一行两列的DataFrame。 - 索引列被写入:默认
to_csv会把DataFrame的索引写进去,你看到的输出里的0、1就是索引,得加index=False关掉它。 - 表头重复写入:虽然设了
header=False,但循环里每次写入其实都不需要表头,保持这个设置就行。
修改后的完整代码
import pandas as pd import os case_array = [['2017042724', '05/18/2017'], ['2017042723', '05/18/2017'], ['2017042722', '05/18/2017'], ['2017042721', '05/18/2017']] filename = 'case_array.csv' path = r"C:\shares\folder" # 加r避免转义字符问题 fullpath = os.path.join(path, filename) # 先判断文件是否存在,避免第一次追加时文件不存在的异常 if not os.path.exists(fullpath): open(fullpath, 'w').close() for case_row in case_array: # 把单个行转成二维列表,生成一行的DataFrame df = pd.DataFrame([case_row]) try: # 用追加模式'a',header=False不写表头,index=False不写索引 with open(fullpath, 'a') as f: df.to_csv(f, header=False, index=False) print(f'成功写入行: {case_row}') except Exception as e: print(f'写入失败: {str(e)}') # 读取验证 try: df = pd.read_csv(fullpath, header=None) print("\n读取到的CSV内容:") print(df) except Exception as e: print(f'读取失败: {str(e)}')
运行后的正确输出
读取到的内容会是:
0 1 0 2017042724 05/18/2017 1 2017042723 05/18/2017 2 2017042722 05/18/2017 3 2017042721 05/18/2017
(如果你不想要读取时自动生成的索引列,可以在read_csv里加index_col=False,或者读取后再处理)
另外注意路径里的\,最好加个r变成原始字符串,避免转义字符引发的错误,比如r"C:\shares\folder"。
内容的提问来源于stack exchange,提问作者user9794893
相关产品推荐
相关产品推荐

