如何将pandas数据添加到现有的csv文件?

Ayo*_*iri 200 python csv dataframe pandas

我想知道是否可以使用pandas to_csv()函数将数据帧添加到现有的csv文件中.csv文件与加载的数据具有相同的结构.

小智 439

您可以在pandas to_csv函数中指定python写入模式.如果附加它是'a'.

在你的情况下:

df.to_csv('my_csv.csv', mode='a', header=False)
Run Code Online (Sandbox Code Playgroud)

默认模式为"w".

  • @Etisha类似`df.to_csv(output_path, mode='a', header=not os.path.exists(output_path))` (48认同)
  • 如何为第一个文件编写标题并自动附加其余行? (9认同)
  • 当然,正确的答案只是一个注释:传递 `index=False` 将告诉 `df.to_csv` 不要将行索引写入第一列。根据应用程序的不同,这可能有助于避免无意义的索引列。 (6认同)
  • 感谢您的回答。这将使我可以逐行追加新的df。但是,您能否让我知道如何在列级追加新的df? (3认同)
  • @MicheleTonutti 辉煌+1 (2认同)

And*_*den 246

您可以通过以附加模式打开文件附加到csv :

with open('my_csv.csv', 'a') as f:
    df.to_csv(f, header=False)
Run Code Online (Sandbox Code Playgroud)

如果这是您的CSV, foo.csv:

,A,B,C
0,1,2,3
1,4,5,6
Run Code Online (Sandbox Code Playgroud)

如果你读了然后追加,例如df + 6:

In [1]: df = pd.read_csv('foo.csv', index_col=0)

In [2]: df
Out[2]:
   A  B  C
0  1  2  3
1  4  5  6

In [3]: df + 6
Out[3]:
    A   B   C
0   7   8   9
1  10  11  12

In [4]: with open('foo.csv', 'a') as f:
             (df + 6).to_csv(f, header=False)
Run Code Online (Sandbox Code Playgroud)

foo.csv 变为:

,A,B,C
0,1,2,3
1,4,5,6
0,7,8,9
1,10,11,12
Run Code Online (Sandbox Code Playgroud)


Dev*_*cie 26

with open(filename, 'a') as f:
    df.to_csv(f, header=f.tell()==0)
Run Code Online (Sandbox Code Playgroud)
  • 除非存在,否则创建文件,否则追加
  • 如果正在创建文件,请添加标题,否则将其跳过

  • 它缺少一个 `mode='a'` 作为 `to_csv` 的参数(即 `df.to_csv(f, mode='a', header=f.tell()==0)` (3认同)
  • @GabrielaMelo 这是在函数 open(filename, 'a') 中传递的。 (3认同)
  • 我在每行数据之间都会有一个额外的空行(在 Windows 上,我猜这很容易受到这种情况的影响),除非我添加一些括号:`header=(f.tell()==0)` - 并且还写:` with open(filename, 'a', newline='') as f:` (2认同)

KCz*_*zar 18

我使用一个小帮助函数与一些标题检查安全措施来处理它:

def appendDFToCSV_void(df, csvFilePath, sep=","):
    import os
    if not os.path.isfile(csvFilePath):
        df.to_csv(csvFilePath, mode='a', index=False, sep=sep)
    elif len(df.columns) != len(pd.read_csv(csvFilePath, nrows=1, sep=sep).columns):
        raise Exception("Columns do not match!! Dataframe has " + str(len(df.columns)) + " columns. CSV file has " + str(len(pd.read_csv(csvFilePath, nrows=1, sep=sep).columns)) + " columns.")
    elif not (df.columns == pd.read_csv(csvFilePath, nrows=1, sep=sep).columns).all():
        raise Exception("Columns and column order of dataframe and csv file do not match!!")
    else:
        df.to_csv(csvFilePath, mode='a', index=False, sep=sep, header=False)
Run Code Online (Sandbox Code Playgroud)


Gra*_*non 6

最初从 pyspark 数据帧开始 - 考虑到我的 pyspark 数据帧中的架构/列类型,我遇到了类型转换错误(当转换为 pandas df 然后附加到 csv 时)

通过强制每个 df 中的所有列均为字符串类型,然后将其附加到 csv 中,解决了该问题,如下所示:

with open('testAppend.csv', 'a') as f:
    df2.toPandas().astype(str).to_csv(f, header=False)
Run Code Online (Sandbox Code Playgroud)