Как сохранить все значения множества вложенных словарей в список - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь написать код, который открывает около 900 вложенных словарей с примерно 99% похожим содержимым (очень большим) и сохраняет значение каждого ключа в списке, названном в честь ключа. Например, если бы у меня было два словаря: {data=37} {data=74}, я бы хотел объединить эти два значения в список с именем data, который выводит следующее [37,74]

Вот код, который я сейчас использую для donei sh this:

import pandas as pd
df = pd.read_csv("/Users/---.csv")
i=True
def sort(d):
    for k, v in d.items():
        if isinstance(v, dict):
            sort(v)
        else:
            global i
            if i==True:
                print("{0} : {1}".format(k, v))
                setattr(sys.modules[__name__], k, [v])
                i=False
            else:
                print("{0} : {1}".format(k, v))
                globals()["{}".format(k)].append(v)

            
for i in df['file_num']:
    with open("/Users/--/allDAFs{}.json".format(i)) as f:
        data=json.load(f)
    sort(data)

Проблема состоит в двух аспектах: a. Есть дубликаты, и я не знаю почему. При наличии всего 900 файлов для некоторого ключа существует 1400 значений. б. Я не могу связать их с file_num. Как видите, я сортирую их, используя file_num, и я хотел бы связать каждое значение с file_num, откуда оно взято.

Я знаю, что, возможно, я делаю это не лучшим образом, поэтому любое понимание или совет был бы очень признателен.

РЕДАКТИРОВАТЬ: Вот как мне нужно, чтобы конечный результат выглядел, предпочтительно в pandas DataFrame:

введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Я бы использовал defaultdict. Может быть, я что-то упускаю, но я не вижу проблемы.

import pandas as pd
import collections


def sort(d, output):
    for k, v in d.items():
        if isinstance(v, dict):
            sort(v, output)
        else:
            output[k].append(v)


df = pd.read_csv("/Users/---.csv")
results = collections.defaultdict(list)

for i in df['file_num']:
    with open("/Users/--/allDAFs{}.json".format(i)) as f:
        data = json.load(f)
    sort(data, results)

Тогда результаты будут представлять собой словарь списков, к которым вы можете обращаться с помощью тех же ключей. у вас проблемы с почтовыми индексами, убедитесь, что ключи всегда имеют один и тот же тип данных (str), возможно, даже ascii.

0 голосов
/ 06 августа 2020

Я использовал df.json_normalize (), как предложил Rich ie, и это хорошо сработало.

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