python - 将 json 对象列嵌套到数据框中
问题描述
我有一个包含两列的数据框(df1)。
id information
00100 {'DriversList': {'ProblematicDrivers': [], 'In...
00200 {'DriversList': {'ProblematicDrivers': [], 'In...
信息列包含嵌套的json对象,需要转换成dataFrame,并与ID关联。
df1['information'] 列的 json --
'DriversList': {
'ProblematicDrivers': [
],
'InstalledDrivers': [
{
'DriverName': 'FaxMachine',
'DisplayName': 'Fax',
'Version': '10',
'Date': '06-21-2006'
},
{
'DriverName': 'FaxMachine',
'DisplayName': 'Fax',
'Version': '10',
'Date': '06-21-2006'
}
]
}
}
到目前为止我的代码:
df2 = pd.DataFRame()
data = json_normalize(data = df1['information'])
for x in data['DriversList.InstalledDrivers']:
df2 = df2.append(x)
信息列中的记录数将与 ID 相关联,该 ID 存在于原始数据帧(df1)中
例如 -- 对于第一行,由于信息列包含 2 条 InstalledDrivers 记录,最终输出将有 00100 与 2 行关联。
预期产出——
id Date DriverName DisplayName Version
00100 06-21-2006 FaxMachine Fax 10
00100 06-21-2006 FaxMachine Fax 10
00200 06-21-2006 FaxMachine Fax 10
00200 06-21-2006 FaxMachine Fax 10
只能在数据帧级别处理的任何合适的方法。我也尝试过 JSON_Normalize 但无法将此 JSON 加载到数据框中。是否可以使用 JSON Normalize 来做到这一点,或者是否有任何其他优化的解决方案可用。并且也无法将 id 与转换后的数据帧相关联。
解决方案
IIUC,这是一种可能的方法:
import json
import pandas as pd
# setup
d = """{"DriversList": {
"ProblematicDrivers": [],
"InstalledDrivers": [
{"DriverName": "FaxMachine", "DisplayName": "Fax", "Version": "10", "Date": "06-21-2006"},
{"DriverName": "FaxMachine", "DisplayName": "Fax", "Version": "10", "Date": "06-21-2006"}
]}
}"""
df = pd.DataFrame(data=[d], columns=["information"])
# extract data
data = [drivers for info in df["information"].values for drivers in json.loads(info)["DriversList"]["InstalledDrivers"]]
# create DataFrame
result = pd.DataFrame.from_records(data)
print(result)
输出
DriverName DisplayName Version Date
0 FaxMachine Fax 10 06-21-2006
1 FaxMachine Fax 10 06-21-2006
更新
您可以通过执行以下操作将每个 id 与驱动程序相关联:
df = pd.DataFrame(data=[['00100', d]], columns=["id", "information"])
# extract data
data = [{"id": i, **drivers} for i, info in df[["id", "information"]].values for drivers in json.loads(info)["DriversList"]["InstalledDrivers"]]
# create DataFrame
result = pd.DataFrame.from_records(data)
print(result)
上面的代码id
在记录中添加了一个条目。
推荐阅读
- python - 发布的数据不会出现在 DRF 序列化程序属性上
- linux - linux shell脚本的cURL中将变量连接到URL末尾
- angular - ASP.NET CORE 身份验证 cookie 消失
- spring - Spring MVC:如何避免在控制器和实体处重复验证
- android - 不从资源创建时无法选择 Android 微调器项目
- sql - 如何查询在另一个字段中与该行上的值共享相同值的所有值?
- laravel - 尝试在帖子的时间线中显示评论
- json - 如何将 JSON 对象从 React Native 发送到 Laravel 服务器?
- ubuntu-18.04 - WSL 问题:“适用于 Linux 的 Windows 子系统没有安装的发行版”
- java - 如何比较两个映射并返回有效的键值对映射