【问题标题】:Append pandas DataFrame column to CSV将 pandas DataFrame 列附加到 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 中。

标签: python csv pandas


【解决方案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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2017-05-21
    • 2018-05-06
    相关资源
    最近更新 更多