python - 熊猫数据框作为嵌套的 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?
解决方案
在我看来,嵌套 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
s 转换为null
s 检查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}}
推荐阅读
- c - C 程序如何在 Linux 环境中执行其他操作的同时轮询用户输入?
- java - 添加到房间数据库
- amazon-ec2 - Ray 没有在 EC2 上启动工作程序
- r - R变异列查询
- javascript - 如何在具有多个对象层的变量中返回数组
- c# - 访问不同 Amazon EC2 windows 服务器上的 SQL 服务器
- docker - CentOS Docker 映像的目的是什么?
- html - 当︎不起作用时,如何防止 unicode 符号呈现为表情符号?
- javascript - PHP Ajax 响应在被 javascript 解析时给出未定义的数据
- ruby - ruby 有没有办法完全从字符串中取消转义字符?