python pandas: 仅将数据帧的结构(不包括行)导出到SQL

10 浏览
0 Comments

python pandas: 仅将数据帧的结构(不包括行)导出到SQL

我使用的是pandas 0.16和sqlalchemy。\n是否可能仅将数据框的结构(即列名和数据类型)而不包括行导出到SQL?\n我能够实现的最接近的方法是仅导出第一行:\n

df.ix[[0],:].to_sql( tablename, myconnection )

\n然后我必须执行截断表操作。然而,to_csv和to_sql方法之间存在不一致性:to_csv将布尔字段写为字符串\"TRUE\"或\"FALSE\",而to_sql将其写为0或1。这意味着使用dataframe.to_csv创建的文件导入时会比应该更复杂。\n如果我运行\n

df.ix[[],:].to_sql( tablename, myconnection )

\n这样做是行不通的,因为所有列都被导出为文本。

0
0 Comments

问题的出现原因是希望在将DataFrame导出为SQL时,只导出结构而不包含任何行。解决方法是使用drop方法删除所有行后再导出。

首先,需要导入pandas和sqlalchemy库。然后,使用pd.read_csv方法读取csv文件并将其存储在DataFrame df中。

接下来,通过调用df.drop方法,并传入要删除的行的索引列表,实现删除所有行的操作。在此例中,使用列表推导式生成索引列表[x for x in range(0,len(df))],表示删除df中的所有行。

然后,创建一个数据库引擎engine,使用create_engine方法,并传入连接字符串,包括数据库类型、用户名、密码、主机和端口以及数据库名称。

最后,使用df.to_sql方法将DataFrame导出到SQL数据库中。在此例中,传入表名table_name、数据库引擎engine、导出方式为替换已存在的表(if_exists='replace')、每次导出的数据块大小为1000行(chunksize=1000)以及不导出索引(index=False)。

通过以上步骤,就可以将DataFrame的结构(列名和列数据类型)导出到SQL数据库中,而不包含任何行数据。

0
0 Comments

问题的原因是,当使用Pandas的.to_sql()方法将DataFrame导出到SQL时,如果DataFrame为空,即没有任何行数据,那么Pandas会将所有列的数据类型默认设置为文本类型。这导致了一个问题,即无法自动推断列的正确数据类型。

解决方法是手动指定每一列的数据类型,通过在.to_sql()方法的dtype=参数中传入一个字典,将每一列的名称与对应的SQLAlchemy类型进行映射。

具体代码如下:

df.ix[[], :].to_sql(tablename, myconnection, dtype={
    'column1': sqlalchemy.types.Float,
    'column2': sqlalchemy.types.BigInt,
    'column3': sqlalchemy.types.Date,
})

这样做可以确保导出的SQL表的列数据类型与DataFrame中定义的数据类型一致,避免了默认将所有列设置为文本类型的问题。

根据代码的实现,问题出现在data.ix[[], :].iloc[:, 0].dtype这一行。当DataFrame为空时,.dtype方法无法正确返回列的数据类型,导致所有列的数据类型被默认设置为文本类型。

如果遇到这个问题,可以考虑提出一个issue来反馈这个bug,希望Pandas的开发者能够解决这个问题。

总结起来,Pandas在将DataFrame导出到SQL时存在一些不完善的地方,特别是在处理空DataFrame时无法自动推断列的数据类型。为了避免这个问题,我们可以手动指定每一列的数据类型来确保导出的SQL表的列数据类型正确。

0
0 Comments

问题的原因是SQL Server没有布尔数据类型,因此在使用pandas的to_sql方法将数据导出到SQL时,布尔数据会被转换成0和1。解决方法是使用pandas的get_schema函数来获取数据表的结构信息,并将其转换成字符串形式,然后通过执行engine.execute方法来创建数据表。另外,还可以通过创建io.sql.SQLTable对象并获取其table属性来获取一个SQLAlchemy的Table对象,并通过调用create方法来创建数据表。此外,可以通过在dtype参数中传递一个字典来覆盖pandas和SQLAlchemy的默认数据类型映射,以及通过运行SQL语句来删除或禁用约束来控制数据表的约束条件。最后,关于get_schema函数的文档没有在API文档中提到,但可以在github上的issue中找到相关讨论。

以下是整理后的文章:

在使用pandas的to_sql方法将数据导出到SQL时,会遇到一个问题,即布尔数据会被转换成0和1。这是因为SQL Server没有布尔数据类型。那么如何解决这个问题呢?

一个解决方法是使用pandas的get_schema函数。具体操作如下:

from pandas.io.sql import get_schema
engine = ...
df = ..
get_schema(df, 'table_name', con=engine)

这个函数会返回一个字符串形式的数据表结构信息,我们可以通过执行engine.execute方法来创建这个数据表。

除了get_schema函数,还可以通过创建io.sql.SQLTable对象并获取其table属性来获取一个SQLAlchemy的Table对象。然后可以通过调用create方法来创建数据表。

另外,我们还可以通过在dtype参数中传递一个字典来覆盖pandas和SQLAlchemy的默认数据类型映射。这对于需要自定义数据类型的情况非常有用。

此外,还可以通过运行SQL语句来删除或禁用约束来控制数据表的约束条件。比如对于布尔列,Python会自动添加一个约束条件,要求值必须为0或1。我们可以通过运行SQL语句来删除或禁用这个约束条件。

需要注意的是,关于get_schema函数的文档没有在API文档中提到。但是我们可以在github上的issue中找到相关讨论。

希望以上解决方法可以帮助大家解决在将数据导出到SQL时遇到的问题。

0