【问题标题】:How to write a pandas dataframe to CSV file line by line, one line at a time?如何将熊猫数据帧逐行写入CSV文件,一次一行?
【发布时间】:2018-12-20 03:51:14
【问题描述】:

我有一个包含大约 100 万个地址的列表,以及一个查找它们的纬度和经度的函数。由于某些记录格式不正确(或出于任何原因),有时该函数无法返回某些地址的纬度和经度。这将导致 for 循环中断。因此,对于每个成功检索经纬度的地址,我想将其写入输出 CSV 文件。或者,也许不是逐行编写,而是以小块大小编写也可以。为此,我在“追加”模式(mode='a')下使用df.to_csv,如下所示:

for i in range(len(df)):
    place = df['ADDRESS'][i]
    try:
        lat, lon, res = gmaps_geoencoder(place)
    except:
        pass

    df['Lat'][i] = lat
    df['Lon'][i] = lon
    df['Result'][i] = res

    df.to_csv(output_csv_file,
          index=False,
          header=False,
          mode='a', #append data to csv file
          chunksize=chunksize) #size of data to append for each loop

但问题在于,它为每个追加打印整个数据帧。因此,对于n 行,它将写入整个数据帧n^2 次。如何解决这个问题?

【问题讨论】:

  • 为什么不在例外情况下只分配NaN或其他东西,然后在最后写整个DataFrame?如果您不想在 csv 中包含错误数据,您甚至可以将其子集到不为空的位置。
  • 无论如何,如果您确实需要逐行编写,您可以使用df.iloc[i:i+1].to_csv(...) 仅编写您正在使用的一行。
  • 只需在try 块之前声明latlonres 的默认值。

标签: python pandas read-write writetofile


【解决方案1】:

如果你真的想逐行打印。 (你不应该)。

for i in range(len(df)):
    df.loc[[i]].to_csv(output_csv_file,
        index=False,
        header=False,
        mode='a')

【讨论】:

  • 如果逐行打印不是一个好主意,您有什么建议?分块打印?这就是我在代码中尝试的方法,但每次都附加整个数据帧,这就是问题所在。
  • 在循环结束时保存整个数据框?而不是 python 循环使用这样的东西:stackoverflow.com/questions/46799234/…
  • 但是正如我在问题中解释的那样,如果有一些问题,任何问题,由于代码中断,那么到那时所花费的全部时间基本上都是浪费的(对于一百万条记录,它会处理整个数据集需要 6 天)。我想分块或逐行打印只是为了避免这种情况。
猜你喜欢
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
  • 2018-11-11
  • 2013-11-18
  • 1970-01-01
相关资源
最近更新 更多