将pandas DataFrame列附加到CSV

时间:2015-01-08 18:39:45

标签: python csv pandas

我试图将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>

提前谢谢!

2 个答案:

答案 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 次的追加列方法的操作次数:

enter image description here

缺点是,当出于其他目的读取 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')