от
Я пытаюсь преобразовать вложенный JSON в CSV-файл, но я борюсь с логикой, необходимой для структуры моего файла: это JSON с 2 объектами, и я хотел бы преобразовать в CSV только один из них, который является список с вложенностью. Я нашел очень полезную информацию о json в этом посте. Я в основном приспосабливал это к моей проблеме, но это все еще не работает для меня. Мой файл JSON выглядит так:
{
  "tickets":[
    {
      "Name": "Liam",
      "Location": {
        "City": "Los Angeles",
        "State": "CA"
      },
      "hobbies": [
        "Piano",
        "Sports"
      ],
      "year" : 1985,
      "teamId" : "ATL",
      "playerId" : "barkele01",
      "salary" : 870000
    },
    {
      "Name": "John",
      "Location": {
        "City": "Los Angeles",
        "State": "CA"
      },
      "hobbies": [
        "Music",
        "Running"
      ],
      "year" : 1985,
      "teamId" : "ATL",
      "playerId" : "bedrost01",
      "salary" : 550000
    }
  ],
  "count": 2
}

мой код пока выглядит так:
import json
from pandas.io.json import json_normalize
import argparse


def flatten_json(y):
    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 строка за билет в CSV, с заголовками:

Name,Location_City,Location_State,Hobbies_0,Hobbies_1,Year,TeamId,PlayerId,Salary
. Я был бы очень признателен за все, что может сделать клик! Спасибо!              

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

2 Ответы

0 голосов
от
Если у вас уже есть функция для выравнивания объекта Json, вам просто нужно сгладить билеты:
...
with open(args.json_file, "r") as inputFile:  # open json file
    json_data = json.loads(inputFile.read())  # load json content
final_data = pd.DataFrame([flatten_json(elt) for elt in json_data['tickets']])
...
С вашими образцами данных,
final_data
, как и ожидалось:
  Location_City Location_State  Name hobbies_0 hobbies_1   playerId  salary teamId  year
0   Los Angeles             CA  Liam     Piano    Sports  barkele01  870000    ATL  1985
1   Los Angeles             CA  John     Music   Running  bedrost01  550000    ATL  1985
    
0 голосов
от
Для этого может быть более простое решение. Но это должно работать!
import json
import pandas as pd

with open('file.json') as file:
    data = json.load(file)

df = pd.DataFrame(data['tickets'])

for i,item in enumerate(df['Location']):
    df['location_city'] = dict(df['Location'])[i]['City']
    df['location_state'] = dict(df['Location'])[i]['State']

for i,item in enumerate(df['hobbies']):
    df['hobbies_{}'.format(i)] = dict(df['hobbies'])[i]

df = df.drop({'Location','hobbies'}, axis=1)

print(df)
    
...