我试图将pandas DataFrame(单列)附加到现有的CSV,就像this post一样,但它不起作用!相反,我的列被添加到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>
提前谢谢!
答案 0 :(得分:7)
就像@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')
那就是它。
答案 1 :(得分:0)
如果要将许多列迭代添加到大型 csv 文件中,我发现该解决方案有问题。
解决方案是接受 csv 文件来存储转置数据帧。即标题用作索引,反之亦然。
好处是您不会将计算能力浪费在隐蔽的操作上。
以下是常规追加模式 mode='a'
和长度为 5000 的系列追加 100 次的追加列方法的操作次数:
缺点是,当出于其他目的读取 csv 时,您必须转置数据帧以获得“预期的”数据帧。
情节代码:
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')