首页 > 解决方案 > Pandas to_sql - 附加 DataFrame 时增加表的索引

问题描述

我一直致力于开发一种产品,该产品以日常执行数据分析 Python 3.7.0 脚本为中心。每天午夜它会处理大量数据,然后将结果导出到两个 MySQL 表中。第一个将仅包含与当天相关的数据,而另一个表将包含所有执行的连接数据。

为了举例说明我目前拥有的内容,请参见下面的代码,假设df将是数据分析生成的最终 DataFrame:

import pandas as pd
import sqlalchemy

engine = sqlalchemy.create_engine(r"mysql+pymysql://user:psswd@localhost/pathToMyDB")

df = pd.DataFrame({'Something':['a','b','c']})

df.to_sql('DReg', engine, index = True, if_exists='replace') #daily database
df.to_sql('AReg', engine, index = False, if_exists='append') #anual database

正如您在我的第二个to_sql函数的参数中看到的那样,我没有为年度数据库设置索引。但是,我的经理要求我这样做,创建一个以简单规则为中心的索引:它将是一个自动递增的数字索引,它会自动为数据库中保存的与其位置相对应的每一行分配一个数字。

所以基本上,我第一次保存df时,数据库应该是这样的:

index   Something
0       a
1       b
2       c

在我的第二次执行中:

index   Something
0       a
1       b
2       c
3       a
4       b
5       c

但是,当我True在第二个df.to_sql命令中将索引设置为(将其变为df.to_sql('AReg', engine, index = True, if_exists='append'))时,在两次执行之后,我的数据库最终看起来像:

index   Something
0       a
1       b
2       c
0       a
1       b
2       c

我做了一些研究,但找不到允许索引自动增加的方法。我考虑在每次执行时读取年度数据库,然后调整我的数据帧的索引,但我的数据库很容易变得非常庞大,这将使其执行速度非常慢(并且还禁止我在两台计算机上同时执行相同的数据分析而不损害我的索引)。

那么使这个索引工作的最佳解决方案是什么?我在这里想念什么?

标签: pythonmysqlpandasdataframesqlalchemy

解决方案


尽管 Pandas 有很多导出选项,但它的主要目的并不是用作数据库管理 API。管理索引通常是数据库应该处理的事情。

我建议index=False, if_exists='append'使用自动增量索引设置和创建表:

CREATE TABLE AReg (
     id INT NOT NULL AUTO_INCREMENT,
     # your fields here
     PRIMARY KEY (id)
);

推荐阅读