提问者:小点点

将熊猫DataFrame列附加到CSV


我试图将熊猫数据框(单列)附加到现有的CSV中,很像这篇文章,但它不起作用!相反,我的列被添加到csv的底部,并反复重复(csv中的行)

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

终端输出:4032

提前谢谢你!


共2个答案

匿名用户

就像@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')