从 pandas 数据框创建一个 json 对象

Posted

技术标签:

【中文标题】从 pandas 数据框创建一个 json 对象【英文标题】:creating a json object from pandas dataframe 【发布时间】: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。

非常感谢任何帮助。

【问题讨论】:

【参考方案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"]
    

【讨论】:

以上是关于从 pandas 数据框创建一个 json 对象的主要内容,如果未能解决你的问题,请参考以下文章

从 pandas 数据框创建嵌套 JSON

从 pandas 数据框创建单个列

将嵌套对象的JSON转换为Pandas Dataframe

从 json 创建的 Pandas 数据框有未命名的列 - 由于未命名的列问题,无法插入 MySQL

使用 Pandas 嵌套 JSON

使用 JSON 对象展开 Pandas DataFrame 列