向Pandas DataFrame追加新行出现异常索引列问题求助
问题:追加数据到CSV时重复生成索引列,导致数据逐步右移
每次运行模型计算后,将输出变量作为新行追加到云服务器上的归档CSV文件,但每次追加都会生成新的索引列,旧数据逐渐被挤到右侧。尝试过set_index、reset_index方法仍未解决。
关键信息
model_output:待追加的新行变量列表df_old:存储在云服务器的归档CSV文件
原尝试代码
# append results to model output model_output = [[date_today, bh_level_today, bh_change_today, PminusET_today, model, movement, proj_date_end,proj_depth_end]] df_newrow = pd.DataFrame(model_output, columns=['date', 'height', 'rate', 'P_ET', 'model', 'statement', 'model_date','model_height']) # read model_output archive file and append new line df_old = pd.read_csv("ftp://............../wwwhome/FEM_model_output/model_output.csv") df_old.set_index('date') df_new = pd.concat([df_old, df_newrow], ignore_index=True, axis=0) df_new.set_index('date') df_new.reset_index(inplace=True, drop=True) # resave file buffer = io.StringIO() df_new.to_csv(buffer) text = buffer.getvalue() bio = io.BytesIO(str.encode(text)) ftp.storbinary('STOR %s' % os.path.basename("model_output.csv"), bio) print('data uploaded') ftp.quit()
解决方案
问题根源是保存CSV时默认写入了DataFrame的索引列,且读取时未正确处理索引,导致每次追加都新增一列。修改如下:
修改后的代码
# 生成待追加的新行数据 model_output = [[date_today, bh_level_today, bh_change_today, PminusET_today, model, movement, proj_date_end,proj_depth_end]] df_newrow = pd.DataFrame(model_output, columns=['date', 'height', 'rate', 'P_ET', 'model', 'statement', 'model_date','model_height']) # 读取归档文件时,直接指定date列为索引,避免将旧索引识别为数据列 df_old = pd.read_csv("ftp://............../wwwhome/FEM_model_output/model_output.csv", index_col='date') # 拼接新旧数据,重置索引 df_new = pd.concat([df_old, df_newrow], ignore_index=True, axis=0) # 保存CSV时禁止写入索引列(核心修复) buffer = io.StringIO() df_new.to_csv(buffer, index=False) text = buffer.getvalue() bio = io.BytesIO(str.encode(text)) ftp.storbinary('STOR %s' % os.path.basename("model_output.csv"), bio) print('data uploaded') ftp.quit()
关键修复点
- 读取时指定索引列:用
pd.read_csv(..., index_col='date')直接将date列设为DataFrame索引,避免把之前写入的索引列当成普通数据列。 - 保存时不写入索引:
df.to_csv(..., index=False)是核心,禁止把DataFrame的索引写入CSV文件,从根源杜绝多余索引列的生成。 - 修正无效操作:原代码中
df_old.set_index('date')未赋值给变量,实际不会修改原DataFrame,改用read_csv的index_col更高效直接。
内容的提问来源于stack exchange,提问作者davem
相关产品推荐
相关产品推荐

