Объединить несколько столбцов словаря / списка в новые столбцы и строки

Я начал с глубоко вложенного файла JSON (образец одной из записей можно найти здесь) и смог превратить его в результат ниже

TopicId,CallID,»BudgetTopicActionMap,12345″,»BudgetTopicActionMap,12348″,»BudgetTopicActionMap,12350″,»BudgetTopicActionMap,17659″ COMPET-09-2014,H2020-COMPET-2014,,»[{‘action’: ‘COMPET-09-2014 — CSA Coordination and support action’, ‘plannedOpeningDate’: ’11 December 2013′, ‘deadlineModel’: ‘single-stage’, ‘deadlineDates’: [’26 March 2014′], ‘budgetYearMap’: {‘0’: 53040000}, ‘budgetTopicActionMap’: {}}, {‘action’: ‘COMPET-06-2014 — RIA Research and Innovation action’, ‘plannedOpeningDate’: ’11 December 2013′, ‘deadlineModel’: ‘single-stage’, ‘deadlineDates’: [’26 March 2014′], ‘budgetYearMap’: {‘0’: 53040000}, ‘budgetTopicActionMap’: {}}, {‘action’: ‘COMPET-05-2014 — CSA Coordination and support action’, ‘plannedOpeningDate’: ’11 December 2013′, ‘deadlineModel’: ‘single-stage’, ‘deadlineDates’: [’26 March 2014′], ‘budgetYearMap’: {‘0’: 53040000}, ‘budgetTopicActionMap’: {}}]»,, COMPET-11-2014,H2020-COMPET-2014,,»[{‘action’: ‘COMPET-02-2014 — RIA Research and Innovation action’, ‘plannedOpeningDate’: ’11 December 2013′, ‘deadlineModel’: ‘single-stage’, ‘deadlineDates’: [’26 March 2014′], ‘budgetYearMap’: {‘0’: 53040000}, ‘budgetTopicActionMap’: {}}, {‘action’: ‘COMPET-11-2014 — CSA Coordination and support action’, ‘plannedOpeningDate’: ’11 December 2013′, ‘deadlineModel’: ‘single-stage’, ‘deadlineDates’: [’26 March 2014′], ‘budgetYearMap’: {‘0’: 53040000}, ‘budgetTopicActionMap’: {}}, {‘action’: ‘COMPET-01-2014 — RIA Research and Innovation action’, ‘plannedOpeningDate’: ’11 December 2013′, ‘deadlineModel’: ‘single-stage’, ‘deadlineDates’: [’26 March 2014′], ‘budgetYearMap’: {‘0’: 53040000}, ‘budgetTopicActionMap’: {}}]»,, COMPET-1-2016,H2020-COMPET-2016,,,»[{‘action’: ‘COMPET-3-2016-a — IA Innovation action’, ‘plannedOpeningDate’: ’10 November 2015′, ‘deadlineModel’: ‘single-stage’, ‘deadlineDates’: [’03 March 2016′], ‘budgetYearMap’: {‘2016’: 18000000}, ‘budgetTopicActionMap’: {}}]»,»[{‘action’: ‘COMPET-2-2016 — RIA Research and Innovation action’, ‘plannedOpeningDate’: ’10 November 2015′, ‘deadlineModel’: ‘single-stage’, ‘deadlineDates’: [’03 March 2016′], ‘budgetYearMap’: {‘2016’: 7000000}, ‘budgetTopicActionMap’: {}}]» COMPET-2-2016,H2020-COMPET-2016,,,»[{‘action’: ‘COMPET-3-2016-a — IA Innovation action’, ‘plannedOpeningDate’: ’10 November 2015′, ‘deadlineModel’: ‘single-stage’, ‘deadlineDates’: [’03 March 2016′], ‘budgetYearMap’: {‘2016’: 18000000}, ‘budgetTopicActionMap’: {}}]»,»[{‘action’: ‘COMPET-2-2016 — RIA Research and Innovation action’, ‘plannedOpeningDate’: ’10 November 2015′, ‘deadlineModel’: ‘single-stage’, ‘deadlineDates’: [’03 March 2016′], ‘budgetYearMap’: {‘2016’: 7000000}, ‘budgetTopicActionMap’: {}}]»

Удалив несколько столбцов и используя

df = pd.json_normalize(list, sep = «,»)

Проблема в том, что это создало +/- 200 столбцов «BudgetTopicActionMap», которые для каждой записи либо содержат словарь, либо пусты. Мне не удалось сгладить эти словари дальше, так как мне нужно создать новый столбец для каждого ключа, а иногда один словарь содержит несколько идентичных ключей. Кроме того, в некоторых записях есть несколько столбцов BudgetTopicAction, которые не являются пустыми, что потребовало бы некоторой операции плавления, чтобы вместо этого преобразовать их в длинные данные. (Думаю, мне также понадобится операция плавления для неуникальных ключей для каждого словаря)

Это был бы мой желаемый результат:

identifier,callIdentifier,action,plannedOpeningDate,deadlineModel,deadlineDates,budgetYearMap,budgetTopicActionMap COMPET-09-2014,H2020-COMPET-2014,COMPET-09-2014 — CSA Coordination and support action,2013-12-11,single-stage,[’26 March 2014′],{‘0′: 53040000},{} COMPET-09-2014,H2020-COMPET-2014,COMPET-06-2014 — RIA Research and Innovation action,2013-12-11,single-stage,[’26 March 2014’],{‘0′: 53040000},{} COMPET-09-2014,H2020-COMPET-2014,COMPET-05-2014 — CSA Coordination and support action,2013-12-11,single-stage,[’26 March 2014’],{‘0′: 53040000},{} COMPET-11-2014,H2020-COMPET-2014,COMPET-02-2014 — RIA Research and Innovation action,2013-12-11,single-stage,[’26 March 2014’],{‘0′: 53040000},{} COMPET-11-2014,H2020-COMPET-2014,COMPET-11-2014 — CSA Coordination and support action,2013-12-11,single-stage,[’26 March 2014’],{‘0′: 53040000},{} COMPET-11-2014,H2020-COMPET-2014,COMPET-01-2014 — RIA Research and Innovation action,2013-12-11,single-stage,[’26 March 2014’],{‘0′: 53040000},{} COMPET-3-2016-a,H2020-COMPET-2016,COMPET-3-2016-a — IA Innovation action,2015-11-10,’single-stage,[’03 March 2016’],{‘2016′: 18000000},{} COMPET-3-2016-a,H2020-COMPET-2016,COMPET-2-2016 — RIA Research and Innovation action,2015-11-10,’single-stage,[’03 March 2016’],{‘2016′: 7000000},{} COMPET-2-2016,H2020-COMPET-2016,COMPET-3-2016-a — IA Innovation action,2015-11-10,’single-stage,[’03 March 2016’],{‘2016′: 18000000},{} COMPET-2-2016,H2020-COMPET-2016,COMPET-2-2016 — RIA Research and Innovation action,2015-11-10,’single-stage,[’03 March 2016’],{‘2016’: 7000000},{}

Словари объединены в свои собственные столбцы (на основе ключей), и там, где в словаре существуют идентичные ключи, создаются дополнительные строки. Когда для данного идентификатора и callIdentifier имеется несколько ненулевых столбцов budgetTopicAction, каждый столбец получает свою собственную запись.

Я пробовал много подходов, упомянутых здесь, на SO (например, этот или < / a>), но мне почему-то не удается объединить их, чтобы получить желаемый результат. Либо мой датафрейм не меняется, либо меняется в худшую сторону. Кажется, мне нужно как сгладить, так и расплавить, для чего я нашел несколько ответов, но все они были рассчитаны на один или два столбца, а не на 200 (или не учитывали неуникальные ключи для каждого словаря)

Есть идеи, как подойти к этому?

Публикуйте свои данные в виде текста, а не изображений. Также создайте минимальный пример.   —  person AmyV    schedule 07.04.2020

Я узнал как. ›Обновил вопрос.   —  person AmyV    schedule 07.04.2020

Я просматриваю исходную ссылку на данные json, которой вы поделились, так как я считаю, что оттуда будет легче работать. не могли бы вы указать мне точные ключи, которые вас интересуют?   —  person AmyV    schedule 08.04.2020

Извините, исправление: для каждого отдельного вызова API (один вызов создает только одну запись): идентификатор, callIdentifier, действие и budgetYearMap (оба в пределах budgetTopicActionMap внутри budgetOverviewJSONItem)   —  person AmyV    schedule 08.04.2020

Источник: ledsshop.ru

Стиль жизни - Здоровье!