首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有VARCHAR或String列的熊猫数据的dtype定义

带有VARCHAR或String列的熊猫数据的dtype定义
EN

Stack Overflow用户
提问于 2022-07-19 13:44:35
回答 2查看 271关注 0票数 1

我想在字典里找到一些数据,这些资料需要放在熊猫的资料里。dataframe稍后使用sqlalchemy在PostgreSQL表中编写,我希望获得正确的列类型。

因此,我为dataframe指定了dtype。

代码语言:javascript
复制
dtypes = {"forretningshændelse": sqlalchemy.types.String(length=8),
     "forretningsområde": sqlalchemy.types.String(length=40), 
     "forretningsproces": sqlalchemy.types.INTEGER(), 
     "id_namespace": sqlalchemy.types.String(length=100), 
     "id_lokalId": sqlalchemy.types.String(length=36),
     "kommunekode": sqlalchemy.types.INTEGER(), 
     "registreringFra": sqlalchemy.types.DateTime()}

稍后我使用df = pd.DataFrame(item_lst, dtype=dtypes),其中item_lst是一个字典列表。

独立于我在dtype定义中使用String(8)String(length=8)VARCHAR(8)的情况下,pd.DataFrame(item_lst, dtype=dtypes)的结果总是类型为'(String或VARCHAR)‘的对象没有len()。

如何定义dtype以克服此错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-20 14:06:00

与其在创建DataFrame时强制使用数据类型,不如让熊猫推断数据类型(只有df = pd.DataFrame(item_lst)),然后在将DataFrame推到数据库时使用dtypes dict和to_sql(),如下所示:

代码语言:javascript
复制
from pprint import pprint

import pandas as pd
import sqlalchemy

engine = sqlalchemy.create_engine("sqlite://")

item_lst = [{"forretningshændelse": "foo"}]
df = pd.DataFrame(item_lst)
print(df.info())
"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1 entries, 0 to 0
Data columns (total 1 columns):
 #   Column               Non-Null Count  Dtype 
---  ------               --------------  ----- 
 0   forretningshændelse  1 non-null      object
dtypes: object(1)
memory usage: 136.0+ bytes
None
"""

dtypes = {"forretningshændelse": sqlalchemy.types.String(length=8)}
df.to_sql("tbl", engine, index=False, dtype=dtypes)

insp = sqlalchemy.inspect(engine)
pprint(insp.get_columns("tbl"))
"""
[{'autoincrement': 'auto',
  'default': None,
  'name': 'forretningshændelse',
  'nullable': True,
  'primary_key': 0,
  'type': VARCHAR(length=8)}]
"""
票数 1
EN

Stack Overflow用户

发布于 2022-07-19 23:42:46

我相信您混淆了DataFrame中的dtype和SQL表本身上的dtype。

您可能不需要手动指定熊猫本身的数据类型,但如果需要,下面是如何实现的。扰流器警告:在https://pandas.pydata.org/pandasdocs/stable/reference/api/pandas.DataFrame.html中只需要指定单个dtype,因此需要一些循环或手动列工作才能得到不同的类型。

要解决你的问题:

代码语言:javascript
复制
import pandas as pd
import sqlalchemy

engine = sqlalchemy.create_engine("connection_string")

df = pd.DataFrame(item_list)
dtypes = {"forretningshændelse": sqlalchemy.types.String(length=8),
     "forretningsområde": sqlalchemy.types.String(40), 
     "forretningsproces": sqlalchemy.types.INTEGER(), 
     "id_namespace": sqlalchemy.types.String(100), 
     "id_lokalId": sqlalchemy.types.String(36),
     "kommunekode": sqlalchemy.types.INTEGER(), 
     "registreringFra": sqlalchemy.types.DateTime()}

with engine.connect() as engine:
    df.to_sql("table_name",if_exists="replace", con=engine, dtype=dtypes)

提示:在编写代码时避免使用特殊字符,这只会使代码在某一点上更难维护:)。我假设您创建的是一个新的sql表,而不是附加的,否则表的类型就已经定义了。

编码愉快!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73038113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档