Вложенный json столбец объекта в фрейм данных - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть фрейм данных (df1), содержащий два столбца.

id          information 
00100       {'DriversList': {'ProblematicDrivers': [], 'In...   
00200       {'DriversList': {'ProblematicDrivers': [], 'In...

Столбец информации содержит вложенный json объект, который необходимо преобразовать в dataFrame и связать с идентификатором.

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)

Количество записей в столбце информации будет связано с идентификатор, который присутствует в исходном фрейме данных (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

Любой подходящий подход, который может быть обработан только на уровне dataFrame. Я также пробовал JSON_Normalize, но не смог загрузить этот JSON в фрейм данных. Можно ли это сделать с помощью JSON Normalize или есть другое оптимизированное решение? А также не может связать идентификатор с преобразованным фреймом данных.

1 Ответ

2 голосов
/ 13 апреля 2020

IIU C, это возможный подход:

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

Обновление

Вы можете связать каждый идентификатор с драйверами, выполнив следующие действия:

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 к записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...