【问题标题】:using a pandas dataframe without headers to write to mysql with to_sql使用没有标头的 pandas 数据框通过 to_sql 写入 mysql
【发布时间】:2021-03-06 21:47:18
【问题描述】:

我有一个从 excel 表(源)创建的数据框。 Excel 工作表将没有标题行。

我在 mysql 中有一个已经创建的表(目标)。它总是与 Excel 工作表完全相同的布局。

source_data = pd.read_excel(full_path, sheet_name=sheet_name, skiprows=ignore_rows, header=None)

db_engine = [function the returns my mysql engine]

source_data.to_sql(name=table_name, con=db_engine, schema=schema_name, if_exists='append', index=False)

由于 pandas 在插入语句中使用数字作为列名,因此失败并出现错误。

[SQL: INSERT INTO [tablename] (0, 1) VALUES (%(0)s, %(1)s)]

error=(pymysql.err.OperationalError) (1054, "Unknown column '0' in 'field list'

我怎样才能解决这个问题?我可以使用不同的插入方法吗?我真的必须使用表中正确的列名加载数据框吗?

【问题讨论】:

  • 我希望有一种方法可以让 pandas 使用不包含列名的插入语句,并假设我对所有列都有值..即。插入 [tablename] 值 (%0, %1)
  • 我希望这会是您在创建数据框时使用 header=None 时触发的事情之一。

标签: python mysql pandas dataframe sqlalchemy


【解决方案1】:

也许在将数据导入Pandas 之后,您可以将列重命名为不是数字的名称,例如"First", "Second", etc.[str(i) for i in range(len(source_data))]

这将解决 SQL 被数字标签混淆的问题。

【讨论】:

  • 根据错误消息中显示的插入语句判断,panda 使用这些列名构造它。因此,如果它是一个名称,它必须与表的列名匹配。除非有人知道让 panda 使用不同的插入语句样式的方法(假设值完全匹配表中的所有列)。此外,我认为使用数字作为列名可能适用于某些 DBAPI。也许 pymySQL 只是不支持。很高兴听到经验
【解决方案2】:

找不到替代品..在读取期间将列名添加到数据框中..

所以首先我构建了列名列表

sql = ("select [column_name] from [table i get my metadata from];")

db_connection = [my connection for sqlalchemy]

result = db_connection.execute(sql)

column_names = []

for column in result:

column_names.append(column[0])

然后我在读取命令中使用该列列表:

source_data = pd.read_excel(full_path, sheet_name=sheet_name, skiprows=ignore_rows,header=None, names=column_names)

to_sql 语句然后运行而不会出错。

【讨论】:

  • 你也可以col_names = [col["name"] for col in sqlalchemy.inspect(engine).get_columns("your_table_name")]
  • 这可能对某些人有用.. 但对我来说,表格的列比文件多.. 我只是在加载我的元数据列表中的列。
猜你喜欢
  • 2015-08-18
  • 2018-05-12
  • 1970-01-01
  • 2021-01-25
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 2017-05-19
相关资源
最近更新 更多