将 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的主要内容,如果未能解决你的问题,请参考以下文章
将字符串拆分附加到 Pandas DataFrame [关闭]
将dict动态附加到空的Pandas.Dataframe中[重复]
将列表或系列作为一行附加到 pandas DataFrame?