我想在字典里找到一些数据,这些资料需要放在熊猫的资料里。dataframe稍后使用sqlalchemy在PostgreSQL表中编写,我希望获得正确的列类型。
因此,我为dataframe指定了dtype。
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以克服此错误?
发布于 2022-07-20 14:06:00
与其在创建DataFrame时强制使用数据类型,不如让熊猫推断数据类型(只有df = pd.DataFrame(item_lst)),然后在将DataFrame推到数据库时使用dtypes dict和to_sql(),如下所示:
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)}]
"""发布于 2022-07-19 23:42:46
我相信您混淆了DataFrame中的dtype和SQL表本身上的dtype。
您可能不需要手动指定熊猫本身的数据类型,但如果需要,下面是如何实现的。扰流器警告:在https://pandas.pydata.org/pandasdocs/stable/reference/api/pandas.DataFrame.html中只需要指定单个dtype,因此需要一些循环或手动列工作才能得到不同的类型。
要解决你的问题:
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表,而不是附加的,否则表的类型就已经定义了。
编码愉快!
https://stackoverflow.com/questions/73038113
复制相似问题