我试图将熊猫数据框(单列)附加到现有的CSV中,很像这篇文章,但它不起作用!相反,我的列被添加到csv的底部,并反复重复(csv中的行)
with open(outputPath, "a") as resultsFile:
print len(scores)
scores.to_csv(resultsFile, header=False)
print resultsFile
终端输出:4032
提前谢谢你!
就像@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')
就这样。
我发现这个解决方案是有问题的,如果要迭代地将许多列添加到一个大的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')