Python DataFrame interrows()和.to_csv:逐行写入

Python DataFrame interrows()和.to_csv:逐行写入,python,pandas,loops,csv,Python,Pandas,Loops,Csv,我使用下面的脚本 将函数应用于数据帧每行中的列 将该函数的返回写入DataFrame的两个新列中 连续将数据帧写入*.csv 我想了解是否有更好的方法来运行以下计算: df=一个包含500行20列的数据帧 for index, row in df.iterrows(): df.loc[index, 'words'], df.loc[index, 'count'] = transcribe(df.loc[index, 'text']) df.to_csv('out.csv',

我使用下面的脚本

  • 将函数应用于数据帧每行中的列
  • 将该函数的返回写入DataFrame的两个新列中
  • 连续将数据帧写入*.csv
我想了解是否有更好的方法来运行以下计算:

df=一个包含500行20列的数据帧

for index, row in df.iterrows():
    df.loc[index, 'words'], df.loc[index, 'count'] = transcribe(df.loc[index, 'text'])
    df.to_csv('out.csv', encoding='utf-8', index=False)
目前,脚本每次(针对每一行)都将完整的df数据帧输出为*.csv,包括计算行“words”和“counts”的附加值,直到那时。我想知道,是否也可以逐行完成写入,即仅输出csv中已完成的行


谢谢

我不明白您为什么要逐行写入数据帧,而不是在末尾写入整个数据帧,但这里有一个解决方案:在追加模式下写入数据帧的切片(即当前行),只为第一行添加标题:

is_first_row = True
for index, row in df.iterrows():
    df.loc[index, 'words'], df.loc[index, 'count'] = transcribe(df.loc[index, 'text'])
    df.loc[index:index].to_csv('out.csv', encoding='utf-8', index=False, mode='a', header=is_first_row)
    is_first_row = False

根据脚本可能被中断的注释进行更新:
在这种情况下,您可能希望通过检查文件是否已存在或是新文件来确定是否写入标头:

with open('out.csv', encoding='utf-8', mode='a') as f:
    for index, row in df.iterrows():
        df.loc[index, 'words'], df.loc[index, 'count'] = transcribe(df.loc[index, 'text'])
        df.loc[index:index].to_csv(f, index=False, header=f.tell()==0)

在我当前的函数中,所描述的追加模式的效果是,整个数据帧被多次附加。有一个很长的列表,我正在应用一个API作为函数。每当脚本中断时,我都有沉没成本,没有输出。这就是为什么我喜欢一行一行地写。@Christopher:我明白。请参阅此案例的更新答案。如果脚本被中断,您还将丢失当前值
is\u first\u row
,因此您必须动态确定标题条件。作为替代方法,您可能希望将整个逻辑包装在
try
块中,并将数据帧写入其中的
finally
部分。最后一个问题:假设我有一个池/多线程进程,其中每4行都在计算。我怎样才能更改上面的脚本,使每个脚本始终需要4行才能应用函数并写入csv?我不确定您将如何实现它。如果每个线程都有自己的iterrow()循环,则可以按原样使用解决方案,但问题是4个线程将写入一个文件:有关详细信息,请参阅。因此,您可能需要一个队列,其中所有4个线程都将其结果推入,一个线程从队列中获取值,将其附加到数据帧并将其写回(如上所示)。