json_normalize()多个记录路径

8

我正在使用 json_normalize 文档中给出的示例,该文档在这里:pandas.json_normalize — pandas 1.0.3 documentation,不幸的是,我无法粘贴我的实际 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为数组:
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

如果有其他方法可以实现,请告知我。


问题是什么,确切地说?你知道是否可以使用 json_normalize() 来实现吗? - AMC
这就是我想知道的。如果可以使用json_normalize实现。 - NYC Coder
1个回答

6

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')

2
是的,合并是一种不错的方法,它适用于这个JSON,因为状态是唯一的,但在我的原始JSON中没有每个记录的唯一标识符。但我同意你关于json_normalize更多是方便而非总是有效的说法。 - NYC Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接