【问题标题】:creating a json object from pandas dataframe从 pandas 数据框创建一个 json 对象
【发布时间】:2021-01-09 07:24:42
【问题描述】:
      Groups sub-groups selections
    0   sg1    csg1       sc1
    1   sg1    csg1       sc2
    2   sg1    csg2       sc3
    3   sg1    csg2       sc4
    4   sg2    csg3       sc5
    5   sg2    csg3       sc6
    6   sg2    csg4       sc7
    7   sg2    csg4       sc8

我有上面提到的数据框,我正在尝试创建一个 JSON 对象,如下所示:

{
  "sg1": {
    "csg1": ['sc1', 'sc2'],
    "csg2": ['sc3', 'sc4']
  },
  "sg2": {
    "csg3": ['sc5', 'sc6'],
    "csg4": ['sc7', 'sc8']
  }
}

我尝试使用带有 orient 参数的 pandas to_json 和 to_dict,但我没有得到预期的结果。我还尝试按列分组,然后创建列表并将其转换为 JSON。

非常感谢任何帮助。

【问题讨论】:

    标签: python pandas dictionary multi-index


    【解决方案1】:

    您可以groupby ['Groups','sub-groups'] 并使用字典理解从多索引系列构建字典:

    s = df.groupby(['Groups','sub-groups']).selections.agg(list)
    d = {k1:{k2:v} for (k1,k2),v in s.iteritems()}
    
    print(d)
    # {'sg1': {'csg2': ['sc3', 'sc4']}, 'sg2': {'csg4': ['sc7', 'sc8']}}
    

    【讨论】:

      【解决方案2】:

      您需要对感兴趣的列进行分组,例如:

      import pandas as pd
      
      data = {
              'Groups': ['sg1', 'sg1', 'sg1', 'sg1', 'sg2', 'sg2', 'sg2', 'sg2'],
              'sub-groups': ['csg1', 'csg1', 'csg2', 'csg2', 'csg3', 'csg3', 'csg4', 'csg4'],
              'selections': ['sc1', 'sc2', 'sc3', 'sc4', 'sc5', 'sc6', 'sc7', 'sc8']
      }
      
      df = pd.DataFrame(data)
      print(df.groupby(['Groups', 'sub-groups'])['selections'].unique().to_dict())
      

      输出是:

      {
          ('sg1', 'csg1'): array(['sc1', 'sc2'], dtype=object), 
          ('sg1', 'csg2'): array(['sc3', 'sc4'], dtype=object), 
          ('sg2', 'csg3'): array(['sc5', 'sc6'], dtype=object), 
          ('sg2', 'csg4'): array(['sc7', 'sc8'], dtype=object)
      }
      

      【讨论】:

        【解决方案3】:

        让我们试试dictify 函数,它使用来自Groups 的顶级键和来自sub-groups 的相应子级键构建一个嵌套字典:

        from collections import defaultdict
        
        def dictify():
            dct = defaultdict(dict)
            for (x, y), g in df.groupby(['Groups', 'sub-groups']):
                dct[x][y] = [*g['selections']]
            return dict(dct)
        

        # dictify()
        {
            "sg1": {
                "csg1": ["sc1","sc2"],
                "csg2": ["sc3","sc4"]
            },
            "sg2": {
                "csg3": ["sc5","sc6"],
                "csg4": ["sc7","sc8"]
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2014-01-05
          • 2022-11-13
          • 1970-01-01
          • 2020-12-22
          • 2016-12-21
          • 2021-12-24
          • 1970-01-01
          • 2020-07-10
          • 2013-06-04
          相关资源
          最近更新 更多