【问题标题】:pandas read_json with orient="table"pandas read_json with orient="table"
【发布时间】:2020-12-02 20:46:30
【问题描述】:

我已经转储了一个基于 this answer 扩展 json 编码器的数据帧字典。我只是改变了转储数据框的方式,将 orient="records" 更改为 orient="table" 以实现我自己的目的。

不知何故,我无法从 json 读取数据帧;准确地说,pandas 似乎没问题(没有引发异常),但它填充了 NaN 值。

谁能检查我是否做错了什么或者这是否是熊猫的错误​​(可能指的是多索引数据帧)?

我使用的是 pandas 1.1.4 版。

以下代码足以(我希望)测试 pandas 在我的机器上是否为 KO,或者我是否以某种方式弄乱了数据框的格式。我还尝试使用包含两个索引的虚拟数据框来重现此问题,但没有遇到问题。

另请注意,json 显示的 "pandas_version": "0.20.0" 与我的版本不一致(我刚刚进行了全新安装以确保它保持不变)。我已经看到 the doc 的当前 pandas 版本的示例中显示了相同的 0.20.0 版本...

import pandas as pd
s = """{
    "schema": {
        "fields": [{
                "name": "grandeur",
                "type": "string"
            }, {
                "name": "unite",
                "type": "string"
            }, {
                "name": "year",
                "type": "integer"
            }, {
                "name": 1,
                "type": "number"
            }, {
                "name": 2,
                "type": "number"
            }, {
                "name": 3,
                "type": "number"
            }, {
                "name": 4,
                "type": "number"
            }, {
                "name": 5,
                "type": "number"
            }, {
                "name": 6,
                "type": "number"
            }, {
                "name": 7,
                "type": "number"
            }, {
                "name": 8,
                "type": "number"
            }, {
                "name": 9,
                "type": "number"
            }, {
                "name": 10,
                "type": "number"
            }, {
                "name": 11,
                "type": "number"
            }, {
                "name": 12,
                "type": "number"
            }
        ],
        "primaryKey": ["grandeur", "unite", "year"],
        "pandas_version": "0.20.0"
    },
    "data": [{
            "grandeur": "Volumetric soil water layer 1",
            "unite": "m3 m-3",
            "year": 1981,
            "1": 0.3893150916,
            "2": 0.3614713229,
            "3": 0.3965121538,
            "4": 0.3513062306,
            "5": 0.3860211495,
            "6": 0.3507631742,
            "7": 0.3499931922,
            "8": 0.3195245205,
            "9": 0.3078848032,
            "10": 0.3917079828,
            "11": 0.380486904,
            "12": 0.3987094194
        }, {
            "grandeur": "Volumetric soil water layer 1",
            "unite": "m3 m-3",
            "year": 1982,
            "1": 0.3924450997,
            "2": 0.360954089,
            "3": 0.3714920435,
            "4": 0.3366828332,
            "5": 0.329994006,
            "6": 0.3659116305,
            "7": 0.3035419171,
            "8": 0.3143600073,
            "9": 0.3099404359,
            "10": 0.3938543858,
            "11": 0.383870834,
            "12": 0.3909665621
        }]
}"""
pd.read_json(s, orient="table")

【问题讨论】:

  • 也许它与所有这些空格和 s 中的 \n 有关?它们是在您转储 dict 时创建的,还是您将它们添加到美化 s 时创建的?
  • @IoaTzimas 我不这么认为。我只是对其进行了解析,以使其更易于在 SO 上阅读并且更小(行数比这多)。起初它是一个单行,包括所有引号的转义。
  • 这是由于架构中的"name": 1 是整数并且数据的键具有字符串“1”。您可以通过在架构中更改为"name": "1" 来进行测试,以查看 1 中的值是否出现。
  • @Emma 我不太确定。 “1”是列的标签(实际上代表一月);您可以在 json 的“数据”部分中看到值,这些值肯定是浮点数...
  • 正确我正在谈论的问题是架构而不是数据部分。这可能是 pandas 的限制,即整数列名称在将架构和数据信息存储在 to_json 时会遇到问题。但是我刚刚在架构中修改了{ "name": "1", "type": "number" },出现了第1列中的值。

标签: python json pandas


【解决方案1】:

这是因为架构中的字段与数据中的键不匹配。

例如,

架构

{
    "name": 1,   // integer
    "type": "number"
}

数据

"1": 0.3893150916  // "1" is string

================================================ =====

如果您更改架构以匹配数据键。 read_json 应该可以正确读取。

架构

{
    "name": "1",   // string
    "type": "number"
}

数据

"1": 0.3893150916  // "1" is string 

如果示例 json 字符串由 pandas to_json 生成,则它为整数列名称生成了错误的架构。

【讨论】:

  • 其实架构是对的,就是数据错误,显示(应该是整数)字符串。我已经提交了一个问题here。 (作为补充:列的那些整数标签可能看起来很尴尬,但这些是“融化”方法的结果,所以这里没有什么不寻常的......)
  • 我刚刚阅读了问题主题。 JSON 不允许整数键,因此对于这种格式,我同意不允许整数列名或将列名转换为字符串是有意义的。
  • 我个人会选择将整数转换为字符串的警告选项(但这不取决于我)。我有点不明白为什么我的第一个示例(在 SO 中)返回了一个空数据帧,尽管我放在 Github 上的最小示例引发了异常......
猜你喜欢
  • 2021-03-03
  • 2023-02-07
  • 2021-11-27
  • 2019-01-26
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多