将嵌套的键/值和嵌套列表合并到json中

时间:2019-08-15 18:43:42

标签: python json pandas

我正在尝试将字典键/值的嵌套列表合并为单个键和值列表。我正在将csv文件加载到数据帧中,并从中尝试将其转换为嵌套json。请参阅下面的内容,我已经尝试过了。我应该走这条路来创建json还是熊猫是否具有执行这种类型转换的本机功能?

样本数据:

Subject,StudentName,Category
ENGLISH,Jane,
ENGLISH,,A
MATH,Matt,B
MATH,Newman,AA
MATH,,B
MATH,Dylan,A
ENGLISH,Noah,
ENGLISH,,C

尝试过:

df1 = pd.read_csv('../data/file.csv')
json_doc = defaultdict(list)
for _id in df1.T:
    data = df1.T[_id]
    key = data.Subject
    values = {'StudentName': data.StudentName,'Category':data.Category}
    json_doc[key].append(values)

new_d = json.dumps(json_doc, indent=4)

{k: int(v) for k, v in new_d} # error: ValueError: not enough values to unpack (expected 2, got 1)

我从上面的代码中得到了这个

{
    "ENGLISH": [
        {
            "StudentName": "Jane",
            "Category": NaN
        },
        {
            "StudentName": NaN,
            "Category": "A"
        },
        {
            "StudentName": "Noah",
            "Category": NaN
        },
        {
            "StudentName": NaN,
            "Category": "C"
        }
    ],
    "MATH": [
        {
            "StudentName": "Matt",
            "Category": "B"
        },
        {
            "StudentName": "Newman",
            "Category": "AA"
        },
        {
            "StudentName": NaN,
            "Category": "B"
        },
        {
            "StudentName": "Dylan",
            "Category": "A"
        }
    ]
}

如何合并键/值使其看起来像这样?

{
    "ENGLISH": [
        {
            "StudentName": ["Jane","Noah"],
            "Category": ["A","C"]
        }
    ],
    "MATH": [
        {
            "StudentName": ["Matt","Newman","Dylan"]
            "Category": ["B","AA","A"]
        }
    ]
}

1 个答案:

答案 0 :(得分:1)

我尚不完全清楚忽略缺失值是否安全,但这是我的一句话:

df.groupby('Subject').agg(lambda g: list(g.dropna())).to_dict(orient='index')

默认方法(to_jsonto_dict)没有合适的orient选项。因此,我们必须通过按索引分组然后将列数据转换为列表来手动完成一些工作。然后,.to_dict(orient='index')会做您想要的事情(如果您要使用字符串而不是对象,请替换为to_json)。

注意:Subject应该是一列,而不是索引。