首页 > 解决方案 > 使用 csv.writer.writerow / csv.writer.writerows 添加行正在删除标题/列

问题描述

一直在用 pandas 和 csv 测试一些数据管理技术。我要做的是读取一个 csv 文件,向其中添加一些额外的行,然后以相同的格式再次保存。

我创建了一个形状为 (250, 20) 的数据框,其中包含随机值、日期作为索引、字母作为列,然后将其保存为 csv 文件。最终我尝试的是在现有的 csv 文件下面附加相同的数据框。

def _writeBulk(savefile, data):
    df = data.reset_index()
    with open(savefile, 'w', newline='') as outfile:
        writer = csv.writer(outfile)
        writer.writerows(df.to_numpy().tolist())
        outfile.close()

def _writeData(savefile, data):
    df = data.reset_index()
    with open(savefile, 'w', newline='') as outfile:
        writer = csv.writer(outfile)
        for row in range(df.shape[0]):
            writer.writerow(df.iloc[row].tolist())
        outfile.close()

编辑后再次读取文件时,我期望的结果是形状为 (500,20) 的数据框。但似乎该文件不再具有标题(列),形状为(499、200)。

在此处输入图像描述

我已经搜索了解决方案或解释,但在写行时跳过标题是我最接近实际问题的方法。

使用 Python 编辑 csv 文件时跳过标题

任何解释或解决方案将不胜感激。

标签: pythonpandascsv

解决方案


首先,如果您的 .csv 将第一列作为日期(也是索引),则当您将该文件读入 DataFrame 时,您不必使用 .reset_index()

例如,您的 csv 在 Excel 中可能如下所示: 在此处输入图像描述

当您将其读取到数据框时,它变为:

在此处输入图像描述

如果您只是想附加一个具有相同列数的新 DataFrame Date, A,B,C... 您可以简单地这样做:

source_df = pd.read_csv('initial.csv')

# copy of the same dataframe
# it could be a different df as per your requirement
new_df = source_df.copy()

# appending the 2nd dataframe to the 1st
final_df = source_df.append(new_df)

# writing to .csv
final_df.to_csv('final.csv', index=False)

我们设置 index=False 以避免将 DateFrame 默认索引 (0,1,2,3...) 写入最终的 .csv 文件

您的最终 df 将如下所示:

在此处输入图像描述

在 Excel 中查看时:

在此处输入图像描述

说了这么多,如果您希望 DataFrame 将日期作为索引,但是当您写入 .csv 时,它应该有列数据,A,B,C,...

做这个:

source_df = pd.read_csv('test.csv')

# copy of the same dataframe
new_df = source_df.copy()

# appending the 2nd dataframe to the 1st
final_df = source_df.append(new_df)

final_df.set_index(['date'], inplace=True)
final_df.to_csv('final.csv')

你会有,df:

在此处输入图像描述

在 Excel 中查看时:

在此处输入图像描述


推荐阅读