将pandas DataFrame列添加到CSV文件

8

我正在尝试将一个Pandas DataFrame(只有一列)添加到现有的CSV中,类似于这篇文章,但是它没有起作用!相反,我的列在csv底部添加,并且重复了很多次(csv中的行>>列的大小)。这是我的代码:

with open(outputPath, "a") as resultsFile:
    print len(scores)
    scores.to_csv(resultsFile, header=False)
    print resultsFile

终端输出:4032 <open file '/Users/alavin/nta/NAB/results/numenta/artificialWithAnomaly/numenta_art_load_balancer_spikes.csv', mode 'a' at 0x1088686f0>

提前感谢您!


这是终端输出的信息,其中包含有关文件路径和打开方式的详细信息。

1
两个额外的信息会很有帮助:1)resultsFile现有内容是什么样子?(手动检查文件以确认)2)scores DataFrame是什么样子?(scores.head(10)应该足够了) - Paul H
1
它将 scores 数据帧附加到文件的末尾,因为这是 pandas 的 to_csv 功能的工作方式。如果您想将 scores 作为原始 csv 数据帧上的新列附加,则需要将 csv 读入数据帧,附加 scores 列,然后将其写回到 csv。 - alacy
resultsFile 是一个包含5列的csv文件:'timestamp', 'value', 'aaa', 'bbb', 'label'。我希望第6列是 scores DataFrame。我已经验证了所有列的长度都相同。scores 有一个名为's'的列标题。 - BoltzmannBrain
@aus_lacy 我应该澄清一下,我试图在不读取CSV文件的情况下完成这个任务... - BoltzmannBrain
@alavin89 我认为在不打开文件并解析数据的情况下,无法将列附加到csv中的原始数据帧中,因为Python无法知道csv中是否有数据帧可供附加。 - alacy
作为附注,如果您恰好将数据帧使用 df.to_csv 写入 f2.csv 文件,并且您现有的文件名为 f1.csv ... 并且您正在使用 *nix,那么您可以直接使用 paste 命令:paste -d", " f1.csv f2.csv > output.csv - Anzel
2个回答

12

就像 @aus_lacy 已经建议的那样,您只需要先将 csv 文件读入到一个数据帧中,然后连接两个数据帧并将其写回 csv 文件:

假设您现有的数据帧叫做 df

df_csv = pd.read_csv(outputPath, 'your settings here')

# provided that their lengths match
df_csv['to new column'] = df['from single column']

df_csv.to_csv(outputPath, 'again your settings here')

就是这样。


2
我试图避免打开和读取所有数据,但这确实有效 :) - BoltzmannBrain
@alavin89,你必须使用Python吗? - Anzel
@alavin89,如果你仍然需要打开+读取csv的每一行来查找换行符并添加新列,那么这将是困难的。我不喜欢磁盘IO方面,你可以有一个简单的解决方案。 - Anzel
由于某些原因,to_csv() 函数正在新行中添加数据,我想将 dataframe 添加到新列中。你可以帮助我吗?http://pythonfiddle.com/copy-csv-and-dataframe - Veronica
@Veronica 你确定两个数据框的长度确实匹配吗? - Anzel
是的,我犯了一个小错误。我没有使用'pd.read_csv()'读取新的csv文件,而是创建了一个新的数据框。已经修复了。谢谢你花时间提供的解决方案。仍然在帮助新手 :) - Veronica

1

我认为这个解决方案有问题,特别是在需要迭代地向大型 CSV 文件中添加多列时。

一种解决方案是接受 CSV 文件存储转置的数据框。即,标题作为索引,反之亦然。

优点是您不会浪费计算能力进行难以理解的操作。

下面是常规追加模式(mode='a')和向长度为 5000 的系列追加 100 次列的追加列方法的操作时间:

enter image description here

缺点是,为了在其他目的中读取csv文件时获得“预期”的dataframe,您必须转置数据框。

绘图代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt

col = []
row = []
N = 100

# Append row approach
for i in range(N):
    t1 = dt.datetime.now()
    data = pd.DataFrame({f'col_{i}':np.random.rand(5000)}).T
    data.to_csv('test_csv_data1.txt',mode='a',header=False,sep="\t")
    t2 = dt.datetime.now()
    row.append((t2-t1).total_seconds())

# Append col approach
pd.DataFrame({}).to_csv('test_csv_data2.txt',header=True,sep="\t")
for i in range(N):
    t1 = dt.datetime.now()
    data = pd.read_csv('test_csv_data2.txt',sep='\t',header=0)
    data[f'col_{i}'] = np.random.rand(5000)
    data.to_csv('test_csv_data2.txt',header=True,sep="\t")
    t2 = dt.datetime.now()
    col.append((t2-t1).total_seconds())
    
t = pd.DataFrame({'N appendices':[i for i in range(N)],'append row':row,'append col':col})
t = t.set_index('N appendices')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接