【问题标题】:Pandas to_sql set column typePandas to_sql 设置列类型
【发布时间】:2019-12-21 08:04:34
【问题描述】:

我有一列包含字符串格式的数字,我想将其作为浮点数发送到PostresSQL。如何确保 SQLAlchemy 将此列设置为浮点数? (请注意,这可能是列中的 NaN)。这是代码

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine('postgresql://{}:{}@{}:5432/{}'.format(USER, DB_PW, HOST, DB))

df = pd.DataFrame({'String2Number': ['0,2', '', '0,0000001']})

df.to_sql(name='TABLE_NAME', con=engine, index=False)

【问题讨论】:

  • 我通常从我的列中创建一个列表,然后使用 sql alchemy df.column : sa.types.FLOAT 创建一个传递 dtypes 的 dict,然后将此 dict 传递给 to_sql df.to_sql(... dtype=mydict) 中的 dtype 参数
  • @Datanovice 这是一个很棒的模式

标签: python pandas postgresql sqlalchemy


【解决方案1】:

首先,你的数字应该是小数点格式,所以我们需要用逗号替换你的小数点。 接下来,您应该确保to_sql 函数将使用浮点数,并且您可以使用dtype 参数来实现这一点,该参数可以在插入数据库时​​设置列类型(基于sqlalchemy types)。代码如下:

import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy.types import Float # note this import to use sqlalchemy Float type

engine = create_engine('postgresql://{}:{}@{}:5432/{}'.format(USER, DB_PW, HOST, DB))

df = pd.DataFrame({'String2Number': ['0,2', '', '0,0000001']})

# Replacing ',' to '.'
df['String2Number'] = df['String2Number'].apply(lambda x: str(x).replace(',', '.'))

# Set column type as SQLAlchemy Float
df.to_sql(
  name='TABLE_NAME',
  con=engine,
  index=False,
  dtype={'String2Number': Float()}
)

【讨论】:

    【解决方案2】:

    to_sql 有一个名为dtype 的参数,您可以使用它来定义架构。 (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html)

    import pandas as pd
    from sqlalchemy import create_engine
    from sqlalchemy.types import Float
    
    engine = create_engine('postgresql://{}:{}@{}:5432/{}'.format(USER, DB_PW, HOST, DB))
    
    df = pd.DataFrame({'String2Number': ['0,2', '', '0,0000001']})
    
    df.to_sql(name='TABLE_NAME', con=engine, index=False, dtype={"String2Number": Float()})
    
    

    【讨论】:

      【解决方案3】:

      尝试将数据框更改为数字。也许它可以提供帮助。示例:

          df[1] = pd.to_numeric(df[1])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-03
        • 1970-01-01
        • 2019-02-16
        • 2021-05-23
        • 2016-07-11
        • 2018-04-09
        • 2017-05-24
        • 2015-03-02
        相关资源
        最近更新 更多