将json对象列嵌套到数据框中

时间:2020-04-12 21:12:36

标签: python json pandas dataframe

我有一个包含两列的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与转换后的数据框相关联。

1 个答案:

答案 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条目。