Python 熊猫们把鱼肉切成块

Python 熊猫们把鱼肉切成块,python,pandas,sqlite,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) 我试图通过以下方式清理数据库中的数据(2mil行x 141列): 删除任何具有超过32个NaN值的行 正向填充未删除行的所有其他N

我有一个巨大的SQLite数据库,当在单个块中读入pandas时会导致内存错误。通常的解决方法是设置
chunksize
参数:

db = 'rawdb.sqlite'
conn = sqlite3.connect(db)
SQL = 'SELECT * FROM Table'

df = pd.read_sql(SQL, conn, chunksize=10000)
我试图通过以下方式清理数据库中的数据(2mil行x 141列):

  • 删除任何具有超过32个
    NaN
    值的行
  • 正向填充未删除行的所有其他
    NaN
  • 如果数据是单个块,我可以提取所需的数据:

    df[~(df.isnull().sum(axis=1) > 32)].fillna(method='ffill')
    
    如何跨块完成此操作?具体来说,由于
    chunksize=10000
    ,下一个块将从10001数据开始,如果第10001行恰好包含
    NaN
    值,并且该行未被删除,则假定它将从第10000行开始填充


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

    在对块进行迭代时,您可以保存上一次迭代的最后一行,并使用它来填充新块的第一行中缺少的值。例如:

    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,:]
    
    lastrow=pd.Series()#用空序列初始化
    对于pd.read_sql中的块(sql,conn,chunksize=10000):
    
    chunk=chunk[chunk.isnull().sum(axis=1)为什么不在读完所有的块之后在最后用这两个步骤进行清理?既然你的问题得到了回答,你能回答我的问题吗?在最后不清理是性能问题吗?这不是性能问题。你根本无法将整个文件读取到内存中,因为它太大了,所以你只能部分地读取它们(按块),操作并存储它,卸载当前块并读取下一个。这不是我的问题。我理解块的过程。我在质疑你的清理过程。为什么要迭代清理,而不是在结束时一次完成所有操作?你说的“读取所有块后”是什么意思?我假设你的意思是将所有块加载到内存中,但我认为我理解ng你错了。有没有更好的方法来解决这个问题?从技术上讲,由于数据类型混合,列是
    pd.Series
    ,行是
    pd.DataFrame