从熊猫数据框创建一个json对象

时间:2020-09-23 06:20:22

标签: python pandas dictionary multi-index

      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']
  }
}

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

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

您可以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']}}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

让我们尝试使用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"]
    }
}