将 pandas DataFrame 列附加到 CSV

Append pandas DataFrame column to CSV

我正在尝试将 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>

提前致谢!

就像@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 文件来存储转置数据帧。即 headers 作为索引,反之亦然。

好处是您不会将计算能力浪费在阴险的操作上。

这是常规追加模式的操作时间,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')