首页 > 解决方案 > 熊猫数据框作为嵌套的 json

问题描述

我有一个脚本,它将嵌套的 JSON 读取为 pandas 数据框,并向其中添加一个新列并将其另存为 JSON。

import numpy as np
from pandas.io.json import json_normalize

sample_json = {
    "name": {
        "emails": [{"address": "clark.kent@example.com"}],
        "countries": [{"country": "US"}, {"country": "UK"}],
    }
}
df = json_normalize(sample_json)

df["name.hobbies"] = np.nan

print(df)

df.to_json("sample.json", orient="records", lines=True)

我的输出看起来像,

{
    "name.countries": [
        {
            "country": "US"
        },
        {
            "country": "UK"
        }
    ],
    "name.emails": [
        {
            "address": "clark.kent@example.com"
        }
    ],
    "name.hobbies": null
}

我想将数据框保存为嵌套的 JSON,就像这样,

"name": {
        "emails": [{"address": "clark.kent@example.com"}],
        "countries": [{"country": "US"}, {"country": "UK"}],
        "hobbies": null
    }

有没有办法将派生的熊猫数据框保存为嵌套的 JSON?

标签: pythonjsonpandas

解决方案


在我看来,嵌套 json 是最简单的创建字典,添加新值并最后转换为 json:

sample_json['name']['hobies'] = None

j = json.dumps(sample_json)
print (j)
{"name": {"emails": [{"address": "clark.kent@example.com"}], 
          "countries": [{"country": "US"}, {"country": "UK"}],
          "hobies": null}}

Pandas 解决方案 -MultiIndex通过拆分列名创建并创建嵌套字典:

df.columns = df.columns.str.split('.', expand=True)
d = {level: df.xs(level, axis=1).squeeze().to_dict() for level in df.columns.levels[0]}
print (d)

{'name': {'countries': [{'country': 'US'}, {'country': 'UK'}], 
          'emails': [{'address': 'clark.kent@example.com'}], 
          'hobbies': nan}}

并且对于将NaNs 转换为nulls 检查Python NaN JSON 编码器,最简单的是设置s 或用 sNone替换NaN缺失值None

df = df.where(df.notna(), None)
df.columns = df.columns.str.split('.', expand=True)
d = {level: df.xs(level, axis=1).squeeze().to_dict() for level in df.columns.levels[0]}

j = json.dumps(d)
print (j)
{"name": {"countries": [{"country": "US"}, {"country": "UK"}],
          "emails": [{"address": "clark.kent@example.com"}],
          "hobbies": null}}

推荐阅读