我有一个巨大的SQLite数据库,当在一个块中读入pandas时会导致内存错误。通常的解决方法是设置chunksize
参数:
db = 'rawdb.sqlite'
conn = sqlite3.connect(db)
SQL = 'SELECT * FROM Table'
df = pd.read_sql(SQL, conn, chunksize=10000)
我试图通过以下方式清理db(2mil rows x 141列)中的数据:
NaN
个值NaN
值如果它只是一个块,我可以提取我需要的数据:
df[~(df.isnull().sum(axis=1) > 32)].fillna(method='ffill')
如何跨块执行此操作?具体来说,从chunksize = 10000
开始,下一个块将从10001数据开始,如果行10001恰好包含NaN
值如果没有删除行,则假设从行10000填充。
但是,行10000位于上一个块中,因此没有ffill的引用。这将导致行10001 NaN
值未被填充。解决此类问题的模板算法是什么?
答案 0 :(得分:2)
当迭代块时,您可以保存上一次迭代的最后一行,并使用它来填充新块的第一行中的缺失值。例如:
lastrow = pd.Series() # initialize with empty Series
for chunk in pd.read_sql(SQL, conn, chunksize=10000):
chunk = chunk[chunk.isnull().sum(axis=1) <= 32]
# fillna for the first row
chunk.iloc[0,:] = chunk.iloc[0,:].fillna(lastrow)
# fillna for the rest
chunk.fillna(method='ffill', inplace=True)
# do something with chunk
# ...
# save last row for next chunk
lastrow = chunk.iloc[-1,:]