从DataFrame到嵌套Json对象

2024-10-16 17:16:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe df,第一条记录如下所示,例如:

oID mode    flow    custom  s1  s2  plan1   plan2   prop1   prop2   rag eve1    eve2
0   AIR DD  XWERTR1 29.03.2020  16.04.2020  29.03.2020  16.04.2020  29.03.2020  16.03.2020  G   16.03.2020  17.03.2020
1   SEA PP  XWERTR1 07.04.2020  25.03.2020  07.04.2020  25.03.2020  07.04.2020  25.03.2020  A   16.03.2020  17.03.2020
2   AIR DD  XWERTR1 04.04.2020  20.03.2020  04.04.2020  20.03.2020  04.04.2020  20.03.2020  G   16.03.2020  17.03.2020
3   AIR DD  XWERTR1 04.04.2020  20.03.2020  04.04.2020  20.03.2020  04.04.2020  20.03.2020  G   16.03.2020  17.03.2020
4   SEA DD  XWERTR1 04.04.2020  20.03.2020  04.04.2020  20.03.2020  04.04.2020  20.03.2020  R   16.03.2020  17.03.2020

我希望json看起来像这样:

{
    "_id" : "0",
    "oID" : "0",
    "custom" : "XWERTR1",
    "mode" : "AIR",
    "flow" : "DD",
    "milestone" : {
        "creation" : {
            "s1" : "29.03.2020",
            "plan1" : "29.03.2020",
            "prop1" : "29.03.2020"
        },
        "transp" : {
            "s2" : "16.04.2020",
            "plan2" : "16.04.2020",
            "prop2" : "16.04.2020"
        }
    }
    "rag" : "G",
    "eve1" : "16.03.2020",
    "eve2" : "17.03.2020"
}

实际上,在“里程碑”新创建的字段下,我将创建嵌套的类别,即“创建”和“传输”。它们将分别包含s1、plan1、prop1和s2、plan2、prop2的值

我从这里得到了以下代码:Convert Pandas Dataframe to nested JSON但这还不足以解决我的问题,因为我想在Json上添加另一个元素数组(s2,plan2,prop2)

j = (df.groupby(['oID','mode','flow','custom','rag','eve1','eve2'], as_index=False)
             .apply(lambda x: x[['s1','plan1','prop1']].to_dict('r'))
             .reset_index()
             .rename(columns={0:'creation'})
             .to_json(orient='records',date_format='iso'))

我努力让“创建”和“传输”分别包含元素s1、plan1、prop1和s2、plan2、prop2

我该怎么做

谢谢


Tags: modecustomairflowddoids2s1
1条回答
网友
1楼 · 发布于 2024-10-16 17:16:44

经过一段时间后,我可以使用模板方法解决问题:

d = """{
    "Ord" : "%s",
    "MOT" : "%s",
    "MVT" : "%s",
    "CUST" : "%s",
    "milestone" : {
        "creation" : {
            "sla" : "%s",
            "plan" : "%s",
            "proposed" : "%s"
        },
        "Pickup" : {
            "sla" : "%s",
            "plan" : "%s",
            "proposed" : "%s"
        }
    }
}
"""
js = []

for item in df.values:
    js.append(json.loads(d%tuple(item.tolist())))

print(json.dumps(js))

感谢@PeterMortesen和RaminNietzsche的帮助

相关问题 更多 >