Pandas json_normalize 和 JSON 中的空值

Joz*_*sky 11 python json pandas

我有这个示例 JSON

{
    "name":"John",
    "age":30,
    "cars": [
        { "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
        { "name":"BMW", "models":[ "320", "X3", "X5" ] },
        { "name":"Fiat", "models":[ "500", "Panda" ] }
    ]
 }
Run Code Online (Sandbox Code Playgroud)

当我需要将 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'])
Run Code Online (Sandbox Code Playgroud)

这段代码运行良好,但在一些空车(空值)的情况下,我无法 normalize_json。

json 示例

{
    "name":"John",
    "age":30,
    "cars": [
        { "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
        null,
        { "name":"Fiat", "models":[ "500", "Panda" ] }
    ]
 }
Run Code Online (Sandbox Code Playgroud)

抛出的错误

AttributeError: 'NoneType' object has no attribute 'keys'
Run Code Online (Sandbox Code Playgroud)

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

normalized = json_normalize(data['cars'], errors='ignore')
Run Code Online (Sandbox Code Playgroud)

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

met*_*urk 7

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

import flat_table
df = pd.DataFrame(data)
flat_table.normalize(df)
Run Code Online (Sandbox Code Playgroud)

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

   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
Run Code Online (Sandbox Code Playgroud)


voz*_*man 6

您可以填写cars空字典以防止此错误

data['cars'] = data['cars'].apply(lambda x: {} if pd.isna(x) else x)
Run Code Online (Sandbox Code Playgroud)