Я начал с глубоко вложенного файла 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