【问题标题】:Concatenating and sorting thousands of CSV files连接和排序数千个 CSV 文件
【发布时间】:2013-05-13 05:58:14
【问题描述】:

我在磁盘中有数千个 csv 文件。它们每个的大小约为 ~10MB(~10K 列)。这些列中的大多数都包含实数(浮点)值。

我想通过连接这些文件来创建一个数据框。一旦我有了这个数据框,我想按前两列对其条目进行排序。

我目前有以下:

my_dfs = list()
for ix, file in enumerate(p_files):
    my_dfs.append(
       pd.read_csv(p_files[ix], sep=':', dtype={'c1' : np.object_, 'c2' : np.object_}))

print("Concatenating files ...")
df_merged= pd.concat(my_dfs)

print("Sorting the result by the first two columns...")
df_merged = df_merged.sort(['videoID', 'frameID'], ascending=[1, 1])

print("Saving it to disk ..")
df_merged.to_csv(p_output, sep=':', index=False)

但这需要太多内存,以至于我的进程在得到结果之前被杀死(在日志中我看到该进程在使用大约 10GB 内存时被杀死)。

我试图找出它到底在哪里失败,但我仍然无法做到(尽管我希望尽快记录标准输出)

在 Pandas 中有没有更好的方法来做到这一点?

【问题讨论】:

  • 感谢@Nurgle 我以前没有使用过 SQLite。您对我如何将问题转移到它有任何指示吗?
  • 1000s 个文件 * 10MB ~ 10GB,你有这么多可用内存吗?在这种情况下,可能更倾向于使用 db 排序。
  • 你听说过heapq模块和归并排序吗? Guido 实现了这种方法来对大量文件进行排序。在这里查看neopythonic.blogspot.com/2008/10/…
  • @elyase。磁盘中的文本数据在连接时可能会占用多达 10GB,但我了解 Pandas 将 ASCII 浮点数转换为浮点类型,并且它可能有一种有效的机制来保存到磁盘。
  • 这里有一个类似的问题:stackoverflow.com/questions/16110252/…

标签: python pandas


【解决方案1】:

将它们加载到数据库中既简单又灵活,便于日后进行更改,并且可以利用数据库中的所有优化工作。加载后,如果您想获取数据的可迭代,可以运行以下查询并完成:

SELECT * FROM my_table ORDER BY column1, column2

我很确定有更直接的方法可以在 sqlite3 中加载到 sqlite3,但是如果您不想直接在 sqlite 中执行此操作,您可以使用 python 来加载数据,利用 csv 阅读器作为一个迭代器,因此您只需将最少量的内容加载到内存中,如下所示:

import csv
import sqlite3
conn = sqlite3.Connection(dbpath)
c = conn.cursor()

for path in paths:
    with open(path) as f:
         reader = csv.reader(f)
         c.executemany("INSERT INTO mytable VALUES (?,?,?)""", reader)

这样,您不必在内存中加载太多内容,并且可以利用 sqlite。

之后(如果您想再次在 Python 中执行此操作),您可以这样做:

import csv
import sqlite3
conn = sqlite3.Connection(dbpath)
c = conn.cursor()

with open(outpath) as f:
    writer = csv.writer
    writer.writerows(c.execute("SELECT * FROM mytable ORDER BY col1, col2"))

【讨论】:

  • 谢谢杰夫。这非常有帮助。我想知道,有没有办法用 HDF5 做到这一点? PyTables/HDF5 是否支持这种类型的访问? (即通过排序选择)
  • @user815423426 您可以查看querying hdf5 in pandas works 的方式,但我认为您必须先将整个数据帧(或数据帧的子集)加载到内存中,然后才能对表格进行排序/更改。你也可以load from sqlite/sql database into pandas
猜你喜欢
  • 2016-12-14
  • 2016-02-29
  • 2022-01-15
  • 2011-09-13
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
相关资源
最近更新 更多