连接和排序数千个CSV文件

时间:2013-05-18 00:48:58

标签: python pandas

我在磁盘中有数千个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的内存时进程被终止)。

我正在试图找出它到底失败的地方,但我仍然无法做到(虽然我希望尽快登录stdout)

在熊猫中有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

将它们加载到数据库中很容易,以后可以灵活地进行更改,并利用进入数据库的所有优化工作。加载后,如果要获取可迭代的数据,可以运行以下查询并完成:

SELECT * FROM my_table ORDER BY column1, column2

我很确定在sqlite3中有更多直接加载到sqlite3的方法,但如果你不想直接在sqlite中加载,你可以使用python来加载数据,利用csv reader作为迭代器,因此您只需将最小量加载到内存中,如:

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"))