JSON не разбивается на разные ячейки

У меня проблема. У меня есть json, который содержит журналы. У каждого logs может быть change, но не должны. Итак, я хочу показать logs с changes в пандах. Но, к сожалению, изменения не распределяются по разным ячейкам (например, id и operation). Таким образом, полный changes — это одна ячейка. Как я могу получить следующий вывод, как показано ниже?

{'model': 
     {'logs': 
          [{'id': '001',
            'changes': 
                      [{'id': '101','operation': 'UPDATE'}]},
                        {'id': '0000000017b068fc',
             'changes': 
                      [{'id': '201','operation': 'UPDATE'}]},
           {'id': '002',
              'changes': 
                      [{'id': '102','operation': 'UPDATE'},
                       {'id': '202','operation': 'UPDATE'},
                       {'id': '302','operation': 'UPDATE'}]},
          {'id': '003', 
               'changes': 
                      []},
          {'id': '004', 
                'changes': 
                       []},

Код

import pandas as pd
df=pd.json_normalize(result['model']['logs'])

Что я имею

[OUT]
id  changes
0   001 [{'id': '101'...
1   002 [{'id': '102'...
3   003 []

Что я хочу


[OUT]

     id     changes.id    changes.operation
0    001    101           UPDATE
1    001    201           UPDATE
2    002    102           UPDATE
3    002    202           UPDATE
4    002    302           UPDATE
5    003    None          None
6    004    None          None
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пытаться:

out = pd.json_normalize(result['model']['logs'], 'changes', 'id', 
                        record_prefix='changes.', errors='ignore')
print(out)

# Output
  changes.id changes.operation                id
0        101            UPDATE               001
1        201            UPDATE  0000000017b068fc
2        102            UPDATE               002
3        202            UPDATE               002
4        302            UPDATE               002

Обновлять

Если вам нужно сохранить строки NaN, используйте:

out = pd.json_normalize(result['model']['logs']).explode('changes')
changes = pd.DataFrame(out.pop('changes').to_dict()).T.add_prefix('changes.')
out = pd.concat([out, changes], axis=1)
print(out)

# Output
                 id changes.id changes.operation
0               001        101            UPDATE
1  0000000017b068fc        201            UPDATE
2               002        302            UPDATE
2               002        302            UPDATE
2               002        302            UPDATE
3               003        NaN               NaN
4               004        NaN               NaN

Установите errors='ignore', так как changes не является обязательным для журнала

sayeed910 28.03.2022 10:48

@Сайид. Что касается первой части ответа, верно?

Corralien 28.03.2022 10:50

@Корралиен, да. Только для первой части.

sayeed910 28.03.2022 11:00

Другие вопросы по теме