pandas.DataFrame.to_sql的进度条

And*_*rei 6 python sqlite dataframe pandas tqdm

我想将数据从大型csv文件迁移到sqlite3数据库.

我使用pandas在Python 3.5上的代码:

con = sqlite3.connect(DB_FILENAME)
df = pd.read_csv(MLS_FULLPATH)
df.to_sql(con=con, name="MLS", if_exists="replace", index=False)
Run Code Online (Sandbox Code Playgroud)

是否可以打印执行to_sql方法的当前状态(进度条)?

我查看了关于tqdm的文章,但没有找到如何做到这一点.

mir*_*ixx 11

Unfortuantely DataFrame.to_sql不提供chunk-by-chunk回调,tqdm需要它来更新其状态.但是,您可以按块处理数据帧块:

import sqlite3
import pandas as pd
from tqdm import tqdm

DB_FILENAME='/tmp/test.sqlite'

def chunker(seq, size):
    # from http://stackoverflow.com/a/434328
    return (seq[pos:pos + size] for pos in xrange(0, len(seq), size))

def insert_with_progress(df, dbfile):
    con = sqlite3.connect(dbfile)
    chunksize = int(len(df) / 10) # 10%
    with tqdm(total=len(df)) as pbar:
        for i, cdf in enumerate(chunker(df, chunksize)):
            replace = "replace" if i == 0 else "append"
            cdf.to_sql(con=con, name="MLS", if_exists=replace, index=False)
            pbar.update(chunksize)

df = pd.DataFrame({'a': range(0,100000)})
insert_with_progress(df, DB_FILENAME)
Run Code Online (Sandbox Code Playgroud)

注意我在这里生成DataFrame inline是为了拥有一个没有依赖性的完整可行的例子.

结果令人惊叹:

在此输入图像描述

  • 我的 csv 文件在磁​​盘上占用 1.7 GB 空间,因此 df=pd.read_csv(csv_filename, ...) 运行速度非常慢。但我在这里找到了解决方案:http://stackoverflow.com/a/28371706/5856795,所以你的答案和答案@sebastian-raschka帮助我完成这项任务。 (2认同)

小智 6

我想分享 miraculixx 发布的解决方案的一个变体 - 我必须为 SQLAlchemy 进行更改:

#these need to be customized - myDataFrame, myDBEngine, myDBTable

df=myDataFrame

def chunker(seq, size):
    return (seq[pos:pos + size] for pos in range(0, len(seq), size))

def insert_with_progress(df):
    con = myDBEngine.connect()
    chunksize = int(len(df) / 10)
    with tqdm(total=len(df)) as pbar:
        for i, cdf in enumerate(chunker(df, chunksize)):
            replace = "replace" if i == 0 else "append"
            cdf.to_sql(name="myDBTable", con=conn, if_exists="append", index=False) 
            pbar.update(chunksize)
            tqdm._instances.clear()

insert_with_progress(df)
Run Code Online (Sandbox Code Playgroud)

  • 您定义了变量“replace”但没有使用它。您的意思是“if_exists=replace”吗? (5认同)