首页 > 解决方案 > 将 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 与转换后的数据帧相关联。

标签: pythonjsonpandasdataframe

解决方案


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在记录中添加了一个条目。


推荐阅读