python - pandas 数据框作为嵌套 json

标签 python json pandas

我有一个脚本,它将嵌套的 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
    }

有没有办法将派生的 pandas 数据帧保存为嵌套 JSON?

最佳答案

在我看来,嵌套 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}}

并将 NaN 转换为 null 检查 Python NaN JSON encoder ,最简单的是设置 None 而不是 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}}

关于python - pandas 数据框作为嵌套 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56472566/

相关文章:

python - 带有权重的 numpy 数组部分和

python - Pandas :强制 'minute' 和 'seconds' 为零

python - 在转换为 JSON 时在列表中附加元素

json - 我如何漂亮地打印 groovy.json.internal.LazyMap 类型的 JsonSlurper.parse (url) 结果

php - 使用 PHP 将 JSON 解析为 MySQL

python - 基于一列保存数据并由 Pandas 中的另一列命名

python - 基于显着性的部分信息寻找完整轮廓

Python 装饰器 @func().attribute 语法错误

python - 使用 Python 将元素附加到 json dict (geojson)

php - 如何在 PHP 中访问更深层次的 JSON 对象