我需要预处理大量 csv 表才能将它们应用到自动编码器。
通过使用pandas,我将所有这些表作为数据框读取。然后我需要根据共享 key (id)合并它们。 merged = pd.merge(df, df1, on='id', how = 'left')
。
但是,经过几次合并后,生成的表的大小变得非常大并杀死了内核。这是我在内核死亡之前获得的合并结果的最后一个大小merged.shape = (29180782, 71)
。我需要合并更多的表。
所有表格都有这样的外观,但有更多的行和列(每列中定义的值显示一个类别):
df: df1:
id a b c d id e f g h
0 2000 1 1 1 3 2000 1 1 1 1
1 2001 2 1 1 3 2001 2 0 0 3
2 2002 1 3 1 2 2002 1 3 1 2
3 2003 2 2 1 1 2003 1 0 1 1
我尝试过 Feather ,但没有帮助。我也尝试向下转换列类型 df['a'] = pd.to_numeric(df['a'], downcast='unsigned')
但我发现表大小没有差异。我想到的最后一个解决方案是使用 chunk。我尝试了以下具有不同 block 大小的代码,但内核再次死机:
for chunk in pd.read_csv('df1', chunksize = 100000, low_memory=False):
df = pd.merge(df,chunk , on='id', how = 'left')
因此我决定写入文件而不是使用变量来防止内核死亡。首先,我将最后合并的表保存在 csv 文件中,以便在下一次合并过程中按 block 读取。
lastmerged.to_csv(r'/Desktop/lastmerged.csv', index=False)
然后:
from csv import writer
for chunk in pd.read_csv('lastmerged.csv', chunksize = 100000, low_memory=False):
newmerge = pd.merge(df1,chunk , on='id', how = 'right')
with open('newmerge.csv', 'a+', newline='') as write_obj:
csv_writer = writer(write_obj)
for i in range (len(newmerge)):
csv_writer.writerow(newmerge.loc[i,:])
我确实在一些小 table 上尝试了这段代码,并得到了想要的结果。但对于我的真实表,运行需要花费大量时间,这让我停止了内核:|此外,代码似乎效率不高!
简而言之,我的问题是当表变得越来越大并导致内核死亡和内存问题时如何合并表。 附:我已经尝试过 google colab、Jupyter 和终端。它们的工作原理都是一样的。
最佳答案
您可以将它们收集在列表中并使用
total_df = pd.concat([df1,df2,df3,df4...,dfn],axis = 1)
你也可以使用
for name in filename:
df = pd.concat([df,pd.read_csv(name,index_col= False)])
这样一来,就可以把内存问题过了
关于python - 合并多个 CSV 文件会导致内核死亡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60469830/