【问题标题】:Flatten super nested JSON to Pandas Dataframe将超级嵌套 JSON 展平为 Pandas 数据框
【发布时间】:2022-01-09 08:17:28
【问题描述】:

我有这个超级嵌套的 json 文件,它需要采用平面形式。以前我有一个类似的 XML 问题,我用下面的简单代码解决了。

df = pdx.read_xml('C:\\python_script\\temp1\\'+file,encoding='utf-8')
df = pdx.fully_flatten(df)
df = df.pipe(flatten)

寻找类似的简单代码来完成这项工作。

这是数据。 https://www.donneesquebec.ca/recherche/dataset/d23b2e02-085d-43e5-9e6e-e1d558ebfdd5/resource/eb4d7620-6aa3-4850-aab6-a0fbe82f2dc1/download/hebdo_20211227_20220102.json

任何帮助将不胜感激。 :)

【问题讨论】:

  • 你想要从这里输出的形状是什么?
  • 我需要带有重复项目的平板。例如,对于每个 ocid,json 中包含多方,因此我需要每一方在单独的列中都有重复的 ocid。简而言之,每个 json 值在一个单独的列中。如果您需要进一步说明,请告诉我。

标签: python json pandas


【解决方案1】:

您可以使用json_normalize(),它非常有效。 这篇文章很好的解释了不同的场景: https://towardsdatascience.com/all-pandas-json-normalize-you-should-know-for-flattening-json-13eae1dfb7dd

这里有一些例子。

some_dict = {
    'key1': 'value1',
    'key2': 'value2',
    'key3': 123,
}
df = pd.json_normalize(some_dict)

对于多个级别,如果您不想要所有级别,您可以使用: pd.json_normalize(data, max_level=1)

使用嵌套列表,您可以使用meta 指定要包含的列表:

json_object = {
    'key1': 'value1',
    'key2': 'value2',

    'key3': {
        'key3_1': 'value3',
        'key3_2': {
          'key3_2_1': {
              'admission': 'value4',
              'general': 'value5'
          },
          'key3_3': 'value6',
      }
    },
    'key4': [
      { 'key4_1': 'value7' },
      { 'key4_2': 'value8' },
      { 'key4_3': 'value9' }
    ],
}

# you can do:
pd.json_normalize(
    json_object, 
    record_path =['key4'],
    meta=['key1', ['key3', 'key3_2', 'key3_3']],
)

如果您的列表并非始终存在所有键,则可以使用errors='ignore'

pd.json_normalize(
    json_object, 
    record_path =['key4'],
    meta=['key1', ['key3', 'key3_2', 'key3_3']],
    errors='ignore'
)

默认情况下,嵌套值将用. 分隔,您可以使用sep='' 进行更改:

pd.json_normalize(
    json_object, 
    record_path =['key4'],
    meta=['key1', ['key3', 'key3_2', 'key3_3']],
    errors='ignore',
    sep='-'
)

这取决于您从本地文件或 URL 获取 JSON 数据的位置。 对于本地文件:

import json
# load data using Python JSON module
with open('data/simple.json','r') as f:
    data = json.loads(f.read())
    
# Flattening JSON data
pd.json_normalize(data)

对于网址:

import requestsURL = 'http://raw.githubusercontent.com/BindiChen/machine-learning/master/data-analysis/027-pandas-convert-json/data/simple.json'
data = json.loads(requests.get(URL).text)# Flattening JSON data
pd.json_normalize(data)

【讨论】:

    【解决方案2】:

    花了将近 2 天后,这是我能想到的最简单的解决方案。

    with open('D:\\Json Data.json') as json_data:
        data = json.load(json_data)
    dic_flattened = [flatten(d) for d in data['releases']]     
    df = pd.DataFrame(dic_flattened)
    

    它转到最低级别并制作单独的列。 下面的文章帮助了我。 https://pypi.org/project/flatten-json/

    【讨论】:

      猜你喜欢
      • 2020-09-27
      • 2023-03-07
      • 2021-05-14
      • 2020-03-11
      • 2021-04-27
      • 2022-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多