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

Я начал с глубоко вложенного файла 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, которые не являются пустыми, что потребовало бы некоторой операции плавления, чтобы вместо этого преобразовать их в длинные данные. (Думаю, мне также понадобится операция плавления для неуникальных ключей для каждого словаря)

См. также:  Базовая 2-D игра на Python (часть 4)

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

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

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

См. также:  Как редактировать учетные данные AWS в терминале?

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

Понравилась статья? Поделиться с друзьями:
IT Шеф
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: