json_normalize с несколькими путями записи - PullRequest
2 голосов
/ 14 апреля 2020

Я использую пример, приведенный в документации json_normalize, приведенной здесь pandas .json_normalize - pandas 1.0.3 документация , я, к сожалению, не могу вставить свои действительные JSON, но этот пример работает. Вставлено из документации:

data = [{'state': 'Florida',
     'shortname': 'FL',
     'info': {'governor': 'Rick Scott'},
     'counties': [{'name': 'Dade', 'population': 12345},
                  {'name': 'Broward', 'population': 40000},
                  {'name': 'Palm Beach', 'population': 60000}]},
    {'state': 'Ohio',
     'shortname': 'OH',
     'info': {'governor': 'John Kasich'},
     'counties': [{'name': 'Summit', 'population': 1234},
                  {'name': 'Cuyahoga', 'population': 1337}]}]
result = json_normalize(data, 'counties', ['state', 'shortname',
                                           ['info', 'governor']])
result


         name  population    state shortname info.governor
0        Dade       12345   Florida    FL    Rick Scott
1     Broward       40000   Florida    FL    Rick Scott
2  Palm Beach       60000   Florida    FL    Rick Scott
3      Summit        1234   Ohio       OH    John Kasich
4    Cuyahoga        1337   Ohio       OH    John Kasich

Что если бы JSON был ниже, где info это массив вместо dict:

data = [{'state': 'Florida',
     'shortname': 'FL',
     'info': [{'governor': 'Rick Scott'}, 
              {'governor': 'Rick Scott 2'}],
     'counties': [{'name': 'Dade', 'population': 12345},
                  {'name': 'Broward', 'population': 40000},
                  {'name': 'Palm Beach', 'population': 60000}]},
    {'state': 'Ohio',
     'shortname': 'OH',
     'info': [{'governor': 'John Kasich'}, 
              {'governor': 'John Kasich 2'}],
     'counties': [{'name': 'Summit', 'population': 1234},
                  {'name': 'Cuyahoga', 'population': 1337}]}]

Как бы вы получили следующий вывод, используя json_normalize:

         name  population    state shortname info.governor
0        Dade       12345   Florida    FL    Rick Scott
1        Dade       12345   Florida    FL    Rick Scott 2
2     Broward       40000   Florida    FL    Rick Scott
3     Broward       40000   Florida    FL    Rick Scott 2
4  Palm Beach       60000   Florida    FL    Rick Scott
5  Palm Beach       60000   Florida    FL    Rick Scott 2
6      Summit        1234   Ohio       OH    John Kasich
7      Summit        1234   Ohio       OH    John Kasich 2    
8    Cuyahoga        1337   Ohio       OH    John Kasich
9    Cuyahoga        1337   Ohio       OH    John Kasich 2

Или, если есть другой способ сделать это, пожалуйста, дайте мне знать.

1 Ответ

1 голос
/ 14 апреля 2020

json_normalize предназначен для удобства, а не гибкости. Он не может обрабатывать все формы JSON (а JSON слишком гибок, чтобы написать универсальный парсер).

Как насчет вызова json_normalize дважды, а затем слияния. Это предполагает, что каждое состояние появляется только один раз в вашем JSON:

counties = json_normalize(data, 'counties', ['state', 'shortname'])
governors = json_normalize(data, 'info', ['state'])

result = counties.merge(governors, on='state')
...