我需要预处理许多csv表才能将它们应用于自动编码器。
通过使用pandas,我将所有这些表读取为数据帧。然后,我需要基于共享密钥(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
我已经尝试过[[羽毛,但没有帮助。我也确实尝试过转换列类型df['a'] = pd.to_numeric(df['a'], downcast='unsigned')
,但是我发现表大小没有差异。我想到的最后一个解决方案是使用块。我尝试了以下具有不同块大小的代码,但内核再次死亡:
for chunk in pd.read_csv('df1', chunksize = 100000, low_memory=False):
df = pd.merge(df,chunk , on='id', how = 'left')
因此,我决定写一个文件而不是使用一个变量来防止内核死亡。首先,我将最后一个合并的表保存在一个csv文件中,以便按块读取它以进行下一个合并过程。
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,:])
我确实在一些小表上尝试过这段代码,并且得到了预期的结果。但是对于我的实际表,它花费了很多时间来运行,这让我停止了内核:|此外,代码似乎效率不高!简而言之,我的问题是当表越来越大时如何合并表并导致内核的死亡和内存问题。ps。我已经尝试过Google colab,Jupyter和Terminal。它们都一样工作。
total_df = pd.concat([df1,df2,df3,df4...,dfn],axis = 1)