Pandas json нормализует свойство объекта, содержащее массив объектов - PullRequest
1 голос
/ 17 апреля 2020

Если у меня есть json данные, отформатированные так:

{
  "result": [
    {
      "id": 878787,
      "name": "Testing",
      "schema": {
        "id": 3463463,
        "smartElements": [
          {
            "svKey": "Model",
            "value": {
              "type": "type1",
              "value": "ThisValue"
            }
          },
          {
            "svKey": "SecondKey",
            "value": {
              "type": "example",
              "value": "ThisValue2"
            }
          }
        ]
      }
    },
    {
      "id": 333,
      "name": "NameName",
      "schema": {
        "id": 1111,
        "smartElements": [
          {
            "svKey": "Model",
            "value": {
              "type": "type1",
              "value": "NewValue"
            }
          },
          {
            "svKey": "SecondKey",
            "value": {
              "type": "example",
              "value": "ValueIs"
            }
          }
        ]
      }
    }
  ]
}

, есть ли способ нормализовать их, чтобы я получил записи:

name          Model          SecondKey        
Testing       ThisValue      ThisValue2
NameName      NewValue       ValueIs

Я могу получить smartElements для серии pandas, но я не могу найти способ выделить smartElements[x].svKey на заголовок столбца и smartElements[x].value.value на значение для этого столбца и / или объединить его.

Ответы [ 2 ]

3 голосов
/ 17 апреля 2020

Я бы пропустил попытку использовать предварительно запеченное решение и просто переместился на json самостоятельно.

import json
import pandas as pd

data = json.load(open('my.json'))

records = []
for d in data['result']:
    record = {}
    record['name'] = d['name']
    for ele in d['schema']['smartElements']:
        record[ele['svKey']] = ele['value']['value']
    records.append(record)

pd.DataFrame(records)

       name      Model   SecondKey
0   Testing  ThisValue  ThisValue2
1  NameName   NewValue     ValueIs
1 голос
/ 17 апреля 2020

Мое решение

import pandas as pd
import json

with open('test.json') as f:
   a = json.load(f)
d = pd.json_normalize(data=a['result'], errors='ignore', record_path=['schema', 'smartElements'], meta=['name'])

print(d)

производит

       svKey value.type value.value      name
0      Model      type1   ThisValue   Testing
1  SecondKey    example  ThisValue2   Testing
2      Model      type1    NewValue  NameName
3  SecondKey    example     ValueIs  NameName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...