Конвертировать файл json с вложенными словарями в одном столбце в Pandas Dataframe - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть файл json со следующей структурой:

[{
"field1": "first",
"field2": "d",
"id": 35,
"features": [
    {
        "feature_id": 2,
        "value": 6
    },
    {
        "feature_id": 3,
        "value": 8.5
    },
    {
      "feature_id":5,
      "value":6.7
    },
    {
    "feature_id":10,
    "value": 3.4
    }
  ],
  "time": "2018-11-17"
},
{
"field1": "second",
"field2": "b",
"id": 36,
"features": [
    {
        "feature_id": 3,
        "value": 5.4
    },
    {
        "feature_id": 10,
        "value": 9.5
    },

  ],
  "time": "2018-11-17"
}]

Я могу изменить это на Pandas Dataframe

import json
import pandas as pd
with open(file) as json_data:
 data = json.load(json_data)

df=pd.DataFrame(data)

, но один столбец имеет вложенный словарь в списке и, следовательно,Столбец функций содержит столбец со списком словарей.Я хочу сгладить все данные, чтобы итоговая таблица выглядела следующим образом.Цените любую помощь?

Final_dataframe

Ответы [ 2 ]

0 голосов
/ 13 августа 2019

Для объединения объекта JSON с вложенными ключами в один Dict используйте следующую функцию.

def flatten_json(nested_json):
"""
    Flatten json object with nested keys into a single level.
    Args:
        nested_json: A nested json object.
    Returns:
        The flattened json object if successful, None otherwise.
"""
out = {}

def flatten(x, name=''):
    if type(x) is dict:
        for a in x:
            flatten(x[a], name + a + '_')
    elif type(x) is list:
        i = 0
        for a in x:
            flatten(a, name + str(i) + '_')
            i += 1
    else:
        out[name[:-1]] = x

flatten(nested_json)
return out

Надеюсь, эта функция поможет вам.

0 голосов
/ 17 ноября 2018

Json помечен с [] для действительного:

data = [{
"field1": "first",
"field2": "d",
"id": 35,
"features": [
    {
        "feature_id": 2,
        "value": 6
    },
    {
        "feature_id": 3,
        "value": 8.5
    },
    {
      "feature_id":5,
      "value":6.7
    },
    {
    "feature_id":10,
    "value": 3.4
    }
  ],
  "time": "2018-11-17"
},
{
"field1": "second",
"field2": "b",
"id": 36,
"features": [
    {
        "feature_id": 3,
        "value": 5.4
    },
    {
        "feature_id": 10,
        "value": 9.5
    },

  ],
  "time": "2018-11-17"
}]

Затем зациклите каждый элемент и для features создайте новые элементы диктовок, последний проход к DataFrame contructor:

L = []
for x in data:
    d = {}
    for k, v in x.items():
        if k == 'features':
            for y in v:
                d[f"feature_id_{y['feature_id']}"] = y['value']
        else:
            d[k] = v
    L.append(d)

df = pd.DataFrame(L)
print (df)
   feature_id_10  feature_id_2  feature_id_3  feature_id_5  field1 field2  id  \
0            3.4           6.0           8.5           6.7   first      d  35   
1            9.5           NaN           5.4           NaN  second      b  36   

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