【问题标题】:Unable to convert pandas DataFrame to json using to_json无法使用 to_json 将 pandas DataFrame 转换为 json
【发布时间】:2015-01-05 13:05:26
【问题描述】:

我知道 Stack Overflow 上还有其他几篇关于同一问题的帖子,但是,在这些帖子中或我在网上找到的任何其他帖子中没有一个解决方案有效。我关注了大量关于 pandas 的教程、视频、书籍和 Stack Overflow 帖子,但所有提到的解决方案都失败了。

令人沮丧的是,我找到的所有解决方案都是正确的,或者至少应该是正确的;我对 pandas 很陌生,所以我唯一的结论是我可能做错了什么。

这是我开始使用的 pandas 文档:Pandas to_json Doc。我似乎无法让 pandas to_json 将 pandas DataFrame 转换为 json 对象或 json 字符串。

基本上,我想将 csv 字符串转换为 DataFrame,然后将该 DataFrame 转换为 json 对象或 json 字符串(我不在乎哪一个)。然后,一旦我有了我的 json 数据结构,我将把它绑定到 D3.js 条形图

这是我正在尝试做的一个示例:

# Declare my csv string (Works):
csvStr = '"pid","dos","facility","a1c_val"\n"123456","2013-01-01 13:37:00","UOFU",5.4\n"65432","2014-01-01 14:32:00","UOFU",5.8\n"65432","2013-01-01 13:01:00","UOFU",6.4'
print (csvStr) # Just checking the variables contents

# Read csv and convert to DataFrame (Works):
csvDf = pandas.read_csv(StringIO.StringIO(csvStr))
print (csvDf) # Just checking the variables contents

# Convert DataFrame to json (Three of the ways I tried - None of them work):
myJSON = csvDf.to_json(path_or_buf = None, orient = 'record', date_format = 'epoch', double_precision = 10, force_ascii = True, date_unit = 'ms', default_handler = None) # Attempt 1
print (myJSON) # Just checking the variables contents

myJSON = csvDf.to_json() # Attempt 2
print (myJSON) # Just checking the variables contents

myJSON = pandas.io.json.to_json(csvDf)
print (myJSON) # Just checking the variables contents

我得到的错误是:

参数 1 必须是字符串或只读字符缓冲区,而不是 DataFrame

这具有误导性,因为文档中说“A Series 或 DataFrame 可以转换为有效的 JSON 字符串。”

不管怎样,我还是尝试给它一个字符串,结果却是完全相同的错误。

我尝试按照书籍和其他教程和/或帖子中的确切步骤创建测试场景,但它只会导致相同的错误。在这一点上,我需要一个简单的解决方案尽快。我愿意接受建议,但我必须强调,我没有时间浪费在学习一个全新的图书馆上。

【问题讨论】:

    标签: python json pandas


    【解决方案1】:

    对于您的第一次尝试,正确的字符串是 'records' 而不是 'record' 这对我有用:

    myJSON = csvDf.to_json(path_or_buf = None, orient = 'records', date_format = 'epoch', double_precision = 10, force_ascii = True, date_unit = 'ms', default_handler = None) # Attempt 1
    

    打印给出:

    [{"pid":123456,"dos":"2013-01-01 13:37:00","facility":"UOFU","a1c_val":5.4},
     {"pid":65432,"dos":"2014-01-01 14:32:00","facility":"UOFU","a1c_val":5.8},
     {"pid":65432,"dos":"2013-01-01 13:01:00","facility":"UOFU","a1c_val":6.4}]
    

    【讨论】:

    • 非常感谢您的回复!你是绝对正确的,东方参数应该是“记录”!谢谢你发现这个错误。如果不是因为我的代码前面的另一个问题(未在此处发布),此解决方案将解决该问题。事实证明,该错误是由于我自己因复制/粘贴而导致的愚蠢错误。我将发布详细信息作为我的问题的答案。虽然,我会将您的回复标记为“有用”,因为您的解决方案对我的代码中的错误有效。编辑:没关系,我不能投票给你的帖子,因为我没有足够的声誉。
    • 没问题。祝你好运!
    【解决方案2】:

    原来问题出在我自己的愚蠢错误上。在测试我对 to_json 的使用时,我将一个示例复制并粘贴到我的代码中,然后从那里开始。以为我已经注释掉了该代码,我开始尝试将 to_json 与我的测试数据一起使用。原来我收到的错误是从我复制和粘贴的示例代码中抛出的。一旦我删除了所有内容并使用我的测试数据重新编写它,它就可以工作了。

    但是,正如 user667648 (Bair) 指出的那样,我的代码中还有另一个错误。 orient 参数应该是 orient = 'records' 而不是 orient = 'record'

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 2021-03-29
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 2019-06-09
      • 2017-01-08
      • 2023-03-31
      相关资源
      最近更新 更多