将 pandas DataFrame 列附加到 CSV

Posted

技术标签:

【中文标题】将 pandas DataFrame 列附加到 CSV【英文标题】:Append pandas DataFrame column to CSV 【发布时间】:2015-03-06 23:43:44 【问题描述】:

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

提前谢谢你!

【问题讨论】:

另外两个信息会有所帮助:1) resultsFile 的现有内容是什么样的? (通过手动检查文件进行确认)和 2)scores DataFrame 是什么样的? (scores.head(10) 就足够了) 它在文件末尾附加了 scores 数据框,因为这就是 pandas to_csv 功能的工作方式。如果您想在原始 csv 数据框中附加 scores 作为新列,则需要将 csv 读取到数据框中,附加 scores 列,然后将其写回 csv。 resultsFile 是 5 列的 csv:'timestamp'、'value'、'aaa'、'bbb'、'label'。我希望第 6 个是 scores DataFrame。我已经验证所有列的长度相同。 scores 有一个列标题“s”。 @aus_lacy 我应该澄清一下,我正在尝试在不读取 csv 的情况下执行此操作... @alavin89 我认为不可能在不打开文件并解析数据的情况下将列附加到 csv 中的原始数据帧,因为 python 无法知道存在数据帧在要附加到的 csv 中。 【参考方案1】:

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

就是这样。

【讨论】:

我试图避免打开和读取所有数据,但这确实有效:) @alavin89,一定要用python吗? @alavin89,那么这将很困难,前提是您仍然需要打开+阅读 csv 的每一行以找到换行符并附加新列。我不喜欢 DiskIO-明智的你可以有一个简单的解决方案 由于某种原因,to_csv() 正在新行中添加数据,我想在新列中添加数据框。你能帮忙吗? pythonfiddle.com/copy-csv-and-dataframe @Veronica 您确定实际匹配的两个数据帧的长度吗?【参考方案2】:

如果要迭代地将许多列添加到大型 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')

【讨论】:

以上是关于将 pandas DataFrame 列附加到 CSV的主要内容,如果未能解决你的问题,请参考以下文章

在 Panda Dataframe 中附加布尔列

将字符串拆分附加到 Pandas DataFrame [关闭]

将dict动态附加到空的Pandas.Dataframe中[重复]

将列表或系列作为一行附加到 pandas DataFrame?

将多个字典附加到 Pandas 数据框:错误 DataFrame 构造函数未正确调用?

Python Pandas Dataframe:如何同时将多个索引附加到列表中?