所以,我有大约 4,000 个 CSV 文件,我需要将它们全部外部连接。每个文件有两列(一个字符串和一个浮点数)和 10,000-1,000,000 行之间,我想通过第一列(即字符串变量)加入。
我试过numpy.lib.recfunctions.join_by
了,但那速度很慢。我切换到了pandas.merge
,这要快得多,但考虑到我拥有的桌子的数量(和大小),它仍然太慢了。而且它似乎真的是内存密集型的——当被合并的文件有数十万行时,机器变得无法使用(我主要使用的是 MacBook Pro,2.4GHz,4GB)。
所以现在我正在寻找替代方案 - 我还缺少其他潜在的解决方案吗?Python 还存在哪些其他外连接实现?是否有论文/网站讨论和比较每个实现的时间复杂度?如果我只是简单地调用 Python 调用 sqlite3,然后让 sqlite3 进行连接会更有效吗?字符串键是问题吗?如果我可以使用数字键,它应该更快吗?
如果它有助于让您更具体地了解我想要实现的目标,这里是我的代码使用pandas.merge
:
import os
import pandas as pd
def load_and_merge(file_names, path_to_files, columns):
'''
seq, str, dict -> pandas.DataFrame
'''
output = pd.DataFrame(columns = ['mykey']) # initialize output DataFrame
for file in file_names:
# load new data
new_data = pd.read_csv(path + file,
usecols = [col for col in columns.keys()],
dtype = columns,
names = ['mykey', file.replace('.csv', '')],
header = None)
# merge with previous data
output = pd.merge(output, new_data, on = 'mykey', how = 'outer')
output = output.fillna(0) # kill NaNs
return output
path = '/Users/username/data/'
files_list = [file for file in os.listdir(path) if '.csv' in file]
merged_table = load_and_merge(files_list, path, {0: 'S30', 1: 'float'})
(Mac OS X 10.6.8 和 Python 2.7.5;Ubuntu 12.04 和 Python 2.7.3)