当前位置: 首页 > 面试题库 >

熊猫to_sql截断我的数据

越朗
2023-03-14
问题内容

df.to_sql(con=con_mysql, name='testdata', if_exists='replace', flavor='mysql')用来将数据框导出到mysql中。但是,我发现具有长字符串内容(例如url)的列被截断为63位数字。导出时,我从ipython笔记本收到以下警告:

/usr/local/lib/python2.7/site-
packages/pandas/io/sql.py:248:警告:第3行cur.executemany(insert_query,data)的列’url’的数据被截断了

对于不同的行,还存在其他相同样式的警告。

有什么我可以调整的方法来正确导出完整数据吗?我可以在mysql中设置正确的数据架构,然后导出到该数据库。但是我希望进行调整可以使其直接从python运行。


问题答案:
如果您使用的是熊猫 0.13.1或更早版本
,则由于代码中的这一行,确实对63位的限制进行了硬编码: https
//github.com/pydata/pandas/blob/v0.13.1/pandas/io/
sql.py#L278

作为一种解决方法,您可能可以monkeypatch该功能get_sqltype

from pandas.io import sql

def get_sqltype(pytype, flavor):
    sqltype = {'mysql': 'VARCHAR (63)',    # <-- change this value to something sufficient higher
               'sqlite': 'TEXT'}

    if issubclass(pytype, np.floating):
        sqltype['mysql'] = 'FLOAT'
        sqltype['sqlite'] = 'REAL'
    if issubclass(pytype, np.integer):
        sqltype['mysql'] = 'BIGINT'
        sqltype['sqlite'] = 'INTEGER'
    if issubclass(pytype, np.datetime64) or pytype is datetime:
        sqltype['mysql'] = 'DATETIME'
        sqltype['sqlite'] = 'TIMESTAMP'
    if pytype is datetime.date:
        sqltype['mysql'] = 'DATE'
        sqltype['sqlite'] = 'TIMESTAMP'
    if issubclass(pytype, np.bool_):
        sqltype['sqlite'] = 'INTEGER'

    return sqltype[flavor]

sql.get_sqltype = get_sqltype

然后只需使用您的代码即可:

df.to_sql(con=con_mysql, name='testdata', if_exists='replace', flavor='mysql')

从pandas 0.14
开始,sql模块在后台使用sqlalchemy,并将字符串转换为sqlalchemyTEXT类型,其中wich转换为mysqlTEXT类型(而不是VARCHAR),这也将允许您存储大于63位数字的较大字符串:

engine = sqlalchemy.create_engine('mysql://scott:tiger@localhost/foo')
df.to_sql('testdata', engine, if_exists='replace')

仅当您仍然使用DBAPI连接而不是sqlalchemy引擎时,问题仍然存在,但是不建议使用此选项,建议向提供一个sqlalchemy引擎to_sql



 类似资料:
  • 问题内容: 我有一个包含文本数据的Python Pandas 对象。我的问题是,当我使用函数时,它会截断输出中的字符串。 例如: 输出在处被截断 关于SO有一个相关问题,但是它使用占位符和搜索/替换功能来对HTML进行后处理,我想避免这种情况: 将Pandas数据框的全部内容写入HTML表 有没有更简单的解决方案来解决这个问题?我从文档中找不到任何相关内容。 问题答案: 您看到的是大熊猫将输出截断

  • 问题内容: 试图使用python将pandas数据框写入MySQL表。以前一直在使用,但是将来会贬值,并希望开始过渡到使用SQLAlchemy引擎。 样例代码: 读取工作正常,但存在错误: DatabaseError:在SQL’SELECT name FROM sqlite_master WHERE type =’table’AND name = ?;’上执行失败:在字符串格式化期间参数数目错误

  • 问题内容: 我有一个看起来像这样的数据框: 也有一个带名为fee_profit的表的sqlite3 db fee_profit有4个栏位: id-整数-主键 perf_period_id-整数 日期-日期 利润-真实 当我尝试将dataframe写入数据库时​​(不显示db连接): 我得到以下代码: 没有传递主键(这可能是问题吗?)我把桌子弄得乱七八糟,肯定看起来像是问题所在的日期。尝试过在索引中

  • 我试图导出我的数据帧到sql数据库(Postgres)。 我创建了如下表: 我想把这个数据框写到sql表中: 但是,当我运行命令写入数据库时,我意识到已经创建了一个新表"OUTPUT",其中插入了数据。 如何避免在表中插入双引号?

  • 问题内容: 在下面,male_trips是一个大熊猫数据帧,station是一个小熊猫数据帧。对于每个车站ID,我想知道有多少次男性旅行。以下工作可以完成,但是需要很长时间: 我应该怎么做呢? 更新!因此,有两种主要方法:其次是和更简单的方法。我很快完成了,这种方法大获全胜!这是代码: 结果如下: 请注意,以这种速度,用于探索数据 键入 value_counts的速度稍微快一些,而且记不起来了!

  • 问题内容: 我有一个熊猫系列,目前看起来像这样: 我想从根本上将其重塑成一个看起来像这样的数据框… 即。逻辑构造,指出每个观察(行)属于哪个类别。 我能够编写基于循环的代码来解决该问题,但是鉴于我需要处理的行数众多,这将非常缓慢。 有谁知道针对这种问题的矢量化解决方案?我将不胜感激。 编辑:有509个类别,我确实有一个清单。 问题答案: