【问题标题】:Pandas json_normalize and null values in JSONJSON 中的 Pandas json_normalize 和 null 值
【发布时间】:2017-10-18 10:49:18
【问题描述】:

我有这个示例 JSON

{
    "name":"John",
    "age":30,
    "cars": [
        { "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
        { "name":"BMW", "models":[ "320", "X3", "X5" ] },
        { "name":"Fiat", "models":[ "500", "Panda" ] }
    ]
 }

当我需要将 JSON 转换为 pandas DataFrame 时,我使用以下代码

import json
from pandas.io.json import json_normalize
from pprint import pprint

with open('example.json', encoding="utf8") as data_file:
    data = json.load(data_file)
normalized = json_normalize(data['cars'])

此代码运行良好,但在一些空车(空值)的情况下,我无法规范化 json。

json 示例

{
    "name":"John",
    "age":30,
    "cars": [
        { "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
        null,
        { "name":"Fiat", "models":[ "500", "Panda" ] }
    ]
 }

抛出的错误

AttributeError: 'NoneType' object has no attribute 'keys'

我试图忽略 json_normalize 中的错误,但没有帮助

normalized = json_normalize(data['cars'], errors='ignore')

我应该如何处理 JSON 中的空值?

【问题讨论】:

    标签: python json pandas


    【解决方案1】:

    您可以用空字典填充cars 以防止出现此错误

    data['cars'] = data['cars'].apply(lambda x: {} if pd.isna(x) else x)
    

    【讨论】:

      【解决方案2】:

      我同意vozman,填空{} 字典将解决问题。但是,我的项目遇到了同样的问题,我制作了一个包来解决这种 DataFrames。查看flat-table,它使用 json_normalize 但也扩展了行和列。

      import flat_table
      df = pd.DataFrame(data)
      flat_table.normalize(df)
      

      这将输出以下内容。列表扩展为不同的行,字典键扩展为不同的列。

         index name_x  age name_y   models
      0      0   John   30   Ford   Fiesta
      1      0   John   30   Ford    Focus
      2      0   John   30   Ford  Mustang
      3      1   John   30    NaN      NaN
      4      2   John   30   Fiat      500
      5      2   John   30   Fiat    Panda
      

      【讨论】:

      • 我有一些 NaN 值,这个包完美地修复了它。感谢 @metinsenturk 提​​供这个 PyPi 包。太棒了!
      【解决方案3】:

      另一个答案如何?

      data['cars'].fillna('{}')
      

      【讨论】:

      • Syscallkkk,虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答问题。请include an explanation for your code,因为这确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 2020-07-21
      • 2021-12-30
      • 2019-07-13
      • 2018-08-19
      • 2022-07-10
      • 1970-01-01
      相关资源
      最近更新 更多