我正在尝试使用 Pandas 合并时间序列数据帧列表(可能超过 100 个)。最大的文件大小为50 MB。行数和列数各不相同(例如,一个文件可能有 45,000 行和 20 列,另一个有 100 行和 900 列),但它们都有共同的“SubjectID”和“Date”列,我正在使用合并数据框。我从 CSV 文件中将数据帧读入列表,我知道每列的数据类型。
但是,当我尝试合并 10 个数据帧时,大约需要 7 个小时,而且对于所有 100 个数据帧,我的内核都崩溃了。读取所有文件大约需要一分钟。这些不是我认为是“大数据”的文件,甚至不是大文件,比如这里、这里或这里的帖子,所以我很惊讶将它们全部合并需要这么长时间。对于所有 100 个数据帧,我预计最终数据帧大小约为 1.5 GB,但即使如此,我认为 Pandas 也可以处理。我合并数据框的代码是
merged_df = reduce(lambda l,r: l.merge(r, on=['SubjectID', 'Date'], how='outer', suffixes=['_COPYL', '_COPYR']), df_list)
因为如果 subjectID 和 date 尚不存在列,我希望在 at 上添加列(我稍后会处理重复项)。
编辑
一些示例数据帧由以下代码生成
import numpy as np
import pandas as pd
from functools import reduce
df1 = pd.DataFrame({'SubjectID': ['A', 'A', 'A', 'B', 'B', 'C', 'A'], 'Date': ['2010-03-14', '2010-03-15', '2010-03-16', '2010-03-14','2010-05-15', '2010-03-14', '2010-03-14'], 'Var1': [np.nan, 1, 4, 7, 90, np.nan, 9], 'Var2': [np.nan, 0, 1, 1, 0, np.nan, 1]})
df2 = pd.DataFrame({'SubjectID': ['A', 'A', 'B', 'B', 'C', 'A'], 'Date': ['2010-03-14', '2010-03-15', '2010-03-14', '2010-05-15', '2010-03-14', '2010-03-14'], 'Var2': [ np.nan, 0, 1, 1, np.nan, 1], 'Var3': [0, 0, 1, np.nan, 0, 1]})
df3 = pd.DataFrame({'SubjectID': ['A', 'A', 'A', 'B', 'B', 'C'], 'Date':['2010-03-14', '2010-03-15', '2010-03-16', '2010-03-14', '2010-05-15', '2010-03-14'], 'Var3': [np.nan, 1, 0, np.nan, 0, 1]})
df1['Date'] = pd.to_datetime(df1['Date'])
df2['Date'] = pd.to_datetime(df2['Date'])
df3['Date'] = pd.to_datetime(df3['Date'])
我合并数据框的代码是
df_list = [df1, df2, df3]
merged_df = reduce(lambda l,r: l.merge(r, on=['SubjectID', 'Date'], how='outer', suffixes=['_COPYL', '_COPYR']), df_list)
merged_df = merged_df.groupby([x.split('_COPY')[0] for x in merged_df.columns], 1).apply(lambda x: x.mode(1)[0])
merged_df['Date'] = pd.to_datetime(merged_df['Date'])
我的预期输出是
Date SubjectID Var1 Var2 Var3
0 2010-03-14 A NaN NaN 0.0
1 2010-03-14 A NaN 1.0 1.0
2 2010-03-14 A 9.0 1.0 0.0
3 2010-03-14 A 9.0 1.0 1.0
4 2010-03-15 A 1.0 0.0 0.0
5 2010-03-16 A 4.0 1.0 0.0
6 2010-03-14 B 7.0 1.0 1.0
7 2010-05-15 B 90.0 0.0 0.0
8 2010-03-14 C NaN NaN 0.0
到目前为止,我已经尝试通过向下转换、在 Pandas 和 CSV 文件中合并的不同方法、转换为稀疏数据帧(我的数据确实有相当数量的 NaN)、使用 Dask 来减少每个列数据类型的内存,并且我我正在考虑在 Python 中使用 sqllite 创建关系数据库。我的版本是 python-64 3.7.0、pandas 0.23.4、Ipython 6.5.0,使用具有 32 GB 内存的 Mac OSX Darwin。我认为我的计算机这样做应该没有问题,但确实如此。真的没有更好的方法还是我做错了我错过的事情?