【问题标题】:pandas json_normalize flatten nested dictionariespandas json_normalize 展平嵌套字典
【发布时间】:2019-11-15 23:19:32
【问题描述】:

我正在尝试使用 json_normalize 来展平嵌套字典。 我的数据是这样的:

data = [
    {'gra': [
        {
            'A': 1,
            'B': 9,
            'C': {'D': '1', 'E': '1'},
            'date': '2019-06-27'
        }
    ]},
    {'gra': [
        {
            'A': 2,
            'B': 1,
            'C': {'D': '1', 'E': '2'},
            'date': '2019-06-27'
        }
    ]},
    {'gra': [
        {
            'A': 6,
            'B': 1,
            'C': {'D': '1', 'E': '3'},
            'date': '2019-06-27'
        }
    ]}
]

我想得到这样的数据框:

A   B    C.D   C.E       date
1   9     1     1     2019-06-27
2   1     1     2     2019-06-27
6   1     1     3     2019-06-27

我在json_normalize 中尝试了record_pathmeta,但它一直给我一个错误。

你是如何做到这一点的?

【问题讨论】:

    标签: json python-3.x pandas


    【解决方案1】:

    json_normalize 在将对象扁平化为 熊猫数据框:

    from pandas.io.json import json_normalize
    json_normalize(sample_object)
    
    from pandas.io.json import json_normalize
    data_ = [item['gra'][0] for item in data] # [{'A': 1, 'B': 9, 'C': {'D': '1', 'E': '1'}, 'date': '2019-06-27'}, {'A': 2, 'B': 1, 'C': {'D': '1', 'E': '2'}, 'date': '2019-06-27'}, {'A': 6, 'B': 1, 'C': {'D': '1', 'E': '3'}, 'date': '2019-06-27'}]
    
    print (json_normalize(data_))
    

    输出:

       A  B C.D C.E        date
    0  1  9   1   1  2019-06-27
    1  2  1   1   2  2019-06-27
    2  6  1   1   3  2019-06-27
    

    【讨论】:

      【解决方案2】:

      迭代列表是最简单的方法,但不能说是最好的方法。

      希望能解决你的问题

      data = [{'gra':[{'A': 1,
                              'B': 9,
                              'C': {'D': '1', 'E': '1'},
                              'date': '2019-06-27'}]},
              {'gra':[{'A': 2,
                               'B': 1,
                               'C': {'D': '1', 'E': '2'},
                               'date': '2019-06-27'}]},
              {'gra':[{'A': 6,
                               'B': 1,
                               'C': {'D': '1', 'E': '3'},
                               'date': '2019-06-27'}]}
              ]
      final_list =[]
      for i in data:
          temp = dict()
          temp['A'] = i['gra'][0]['A']
          temp['B'] = i['gra'][0]['B']
          temp['C.D'] = i['gra'][0]['C']['D']
          temp['C.E'] = i['gra'][0]['C']['E']
          temp['date']=i['gra'][0]['date']
          final_list.append(temp)
      df = pd.DataFrame.from_dict(final_list)
      
      print(df)
      
         A  B C.D C.E        date
      0  1  9   1   1  2019-06-27
      1  2  1   1   2  2019-06-27
      2  6  1   1   3  2019-06-27
      

      【讨论】:

        【解决方案3】:

        首先我们进行规范化,然后破解我们的方式以产生所需的输出

        import pandas as pd 
        
        data = [
            {'gra': [
                {
                    'A': 1,
                    'B': 9,
                    'C': {'D': '1', 'E': '1'},
                    'date': '2019-06-27'
                }
            ]},
            {'gra': [
                {
                    'A': 2,
                    'B': 1,
                    'C': {'D': '1', 'E': '2'},
                    'date': '2019-06-27'
                }
            ]},
            {'gra': [
                {
                    'A': 6,
                    'B': 1,
                    'C': {'D': '1', 'E': '3'},
                    'date': '2019-06-27'
                }
            ]}
        ]
        
        df = pd.json_normalize(data, 'gra')
        
        cols = ['A','B','C.D','C.E','date']
        df = df[cols]
        
        print(df)
        
        A  B C.D C.E        date
        0  1  9   1   1  2019-06-27
        1  2  1   1   2  2019-06-27
        2  6  1   1   3  2019-06-27
        
        [Program finished]
        

        【讨论】:

          猜你喜欢
          • 2019-06-10
          • 2022-01-02
          • 2019-06-12
          • 2021-09-19
          • 2020-08-21
          • 2019-02-12
          • 1970-01-01
          • 2022-01-17
          • 2012-09-06
          相关资源
          最近更新 更多