Лучший способ заменить мою функцию? - PullRequest
0 голосов
/ 25 мая 2018

Я приложил ссылку для передачи данных json для загрузки -

Данные json

В настоящее время я написал следующую функцию для передачи данных каждого уровня для детей в объединенный фрейм данных.-

def get_children(catMapping):
    level4 = json_normalize(catMapping['SuccessResponse']['Body'],
                                        ['children', 'children', 'children', 'children', ['children']])
    level3 = json_normalize(catMapping['SuccessResponse']['Body'],
                                        ['children', 'children', 'children', ['children']])
                        ['children', 'children', ['children']])
    level1 = json_normalize(catMapping['SuccessResponse']['Body'],
                                        ['children', ['children']])
    level0 = json_normalize(catMapping['SuccessResponse']['Body'],
                                        ['children'])

    combined = pd.concat([level0, level1, level2, level3,level4])
    combined = combined.reset_index(drop=True)

    return combined

И похоже, что это не рекомендуемый способ, но я не могу написать функцию, которая может проходить через каждый уровень.

Не могли бы вы помочь мне с какой-нибудь лучшей функцией?

1 Ответ

0 голосов
/ 25 мая 2018

Вот функция, которая рекурсивно повторяет все элементы:

import pandas as pd
import ast

with open(r"data.json", "r") as f:
    data = ast.literal_eval(f.read())

def nest_iter(items):
    for item in items:
        children_ids = [o["categoryId"] for o in item["children"]]
        ret_item = item.copy()
        ret_item["children"] = children_ids
        yield ret_item
        yield from nest_iter(item["children"])

df = pd.DataFrame(nest_iter(data['SuccessResponse']['Body']))

результат:

      categoryId                        children   leaf         name    var
....
4970    10001244                              []   True     Business  False
4971    10001245                              []   True       Casual  False
4972    10001246                              []   True      Fashion  False
4973    10001247                              []   True       Sports  False
4974        7756  [7761, 7758, 7757, 7759, 7760]  False        Women  False
4975        7761                              []   True  Accessories  False
4976        7758                              []   True     Business  False
4977        7757                              []   True       Casual  False
4978        7759                              []   True      Fashion  False
4979        7760                              []   True       Sports  False
...