从 json 创建的 Pandas 数据框有未命名的列 - 由于未命名的列问题,无法插入 MySQL

Posted

技术标签:

【中文标题】从 json 创建的 Pandas 数据框有未命名的列 - 由于未命名的列问题,无法插入 MySQL【英文标题】:Pandas dataframe created from json has unnamed column - can't insert into MySQL due to unnamed column issue 【发布时间】:2017-09-13 17:41:44 【问题描述】:

现在我正在处理一些 JSON 数据,我正试图将其即时推送到 mysql 数据库中。 JSON 文件很大,所以我必须使用 Python 中的 yield 函数逐行仔细检查,将每行 JSON 转换为小的 pandas DF 并将其写入 MySQL。问题是当我从 JSON 创建 DF 时,它会添加索引列。似乎当我向 MySQL 写东西时,它忽略了 index=False 选项。代码如下

import gzip
import pandas as pd
from sqlalchemy import create_engine

#stuff to parse json file
def parseJSON(path):
  g = open(path, 'r')
  for l in g:
      yield eval(l)
#MySQL engine
engine = create_engine('mysql://login:password@localhost:1234/MyDB', echo=False)
#empty df just to have it
df = 

for l in parseJSON("MyFile.json"):
    df = pd.DataFrame.from_dict(l, orient='index')
    df.to_sql(name='MyTable', con=engine, if_exists = 'append', index=False)

我得到一个错误:

OperationalError: (_mysql_exceptions.OperationalError) (1054, "Unknown column '0' in 'field list'")

任何想法我错过了什么?或者有没有办法绕过这些东西?

UPD。每次在内部循环中创建数据框时,我都会看到数据框有一个值为 0 的未命名列。

这里有一些关于 DF 的信息:

df
Out[155]: 
                                                                0
reviewerID                                         A1C2VKKDCP5H97
asin                                                   0007327064
reviewerName                                        Donna Polston
helpful                                                    [0, 0]
unixReviewTime                                         1392768000
reviewText      love Oddie ,One of my favorite books are the O...
overall                                                         5
reviewTime                                            02 19, 2014
summary                                                       Wow

print(df.columns)
RangeIndex(start=0, stop=1, step=1)

【问题讨论】:

听起来列名与您的数据框和表不同。 @BobHaffner,嗨,我仔细检查过,列完全相同。我相信,如果该列不存在,它会让我知道。我稍微更新了问题。 好的,所以它们都匹配,除了你有一个值为 0 的额外列?你能在你的 df.to_sql() 之前做一个print (df.columns) 吗? @BobHaffner 也完成了 好的,现在它更清楚了。您当前有一个框架,其中有一列名为 0,您的预期列名称作为框架的索引。也许您可以尝试df = pd.DataFrame.from_dict(l) 或者您可以尝试df.T.to_sql(name='MyTable', con=engine, if_exists = 'append', index=False) 在将帧推送到mysql 之前转置帧。注意:我认为如果你可以建立一个 dict (或其他结构),将所有行转换为 df 然后推送到 mysql,你会有更好的性能。一次一行可能太慢了? 【参考方案1】:

您当前有一个框架,其中有一列名为 0,您的预期列名称作为框架的索引。或许你可以试试

df = pd.DataFrame.from_dict(l)

注意:我认为如果您可以构建一个 dict(或其他一些结构),将所有行转换为 df 然后推送到 mysql,您将获得更好的性能。每次这一行可能太慢了

【讨论】:

以上是关于从 json 创建的 Pandas 数据框有未命名的列 - 由于未命名的列问题,无法插入 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

从 json 对象创建 pandas 数据框

使用索引日期时间从 pandas 数据帧创建 json

从 pandas 数据框创建嵌套 JSON

从 pandas 数据框创建一个 json 对象

从包含 JSON 的 CSV 文件创建 Pandas DataFrame

从 pandas 数据框创建单个列