我有一个包含两列的dataframe(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的记录,因此最终输出将具有与2行关联的00100。
预期输出-
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
任何只能在dataFrame级别处理的合适方法。 我也尝试了JSON_Normalize,但是无法将此JSON加载到数据框中。是否可以使用JSON Normalize做到这一点,或者是否有其他优化的解决方案可用。而且也无法将ID与转换后的数据框相关联。
答案 0 :(得分:2)
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
条目。