【问题标题】:json_normalize with multiple record paths具有多个记录路径的 json_normalize
【发布时间】:2020-07-26 14:16:03
【问题描述】:

我正在使用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 是下面的 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

或者如果有其他方法,请告诉我。

【问题讨论】:

  • 到底是什么问题?你知道这是否可以使用json_nomalize() 吗?
  • 这就是我想知道的。如果可以使用json_normalize

标签: python json pandas normalize


【解决方案1】:

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

【讨论】:

  • 是的,合并是一个很好的方法,它适用于这个 JSON,因为状态是唯一的,但不是在我的原始 JSON 中,每条记录没有唯一标识符。但我确实同意您关于 json_normalize 的说法更方便,但并不总是有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2016-06-27
  • 2020-05-31
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多