Pandas fillna穿过大块

时间:2017-04-17 15:55:16

标签: python pandas sqlite

我有一个巨大的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列)中的数据:

  1. 删除超过32 NaN个值
  2. 的任何行
  3. 转发请填写未删除的行的所有其他NaN
  4. 如果它只是一个块,我可以提取我需要的数据:

    df[~(df.isnull().sum(axis=1) > 32)].fillna(method='ffill')
    

    如何跨块执行此操作?具体来说,从chunksize = 10000开始,下一个块将从10001数据开始,如果行10001恰好包含NaN值如果没有删除行,则假设从行10000填充。

    但是,行10000位于上一个块中,因此没有ffill的引用。这将导致行10001 NaN值未被填充。解决此类问题的模板算法是什么?

1 个答案:

答案 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,:]