【问题标题】:Retrive json value from nested json which is present in pandas dataframe从 pandas 数据框中存在的嵌套 json 中检索 json 值
【发布时间】:2020-05-10 11:37:09
【问题描述】:

我有 pandas 数据框,其中一列的条目采用嵌套 json 形式,如下所示

Date              ID              Request

12/01/2020        123            {"requestChannel":"amazon","userID":"123@abc.com","Context":"
                                 {\"ref_id\":[\"1-123456\"],\"type\":\"Apparels\","formJson":null,"additionalData":null},"additional":
                                 {"ref_id":"1-12345","last_saved":"order"}}

and thousands of rows like this in same format

我想根据“ID”只取出嵌套第二个json中的“类型”,如下所示:

Output

Date             ID        Request

12/01/2020       123       Apparels

我要做的是解析数据帧的请求列,因为 json 遍历整行并从第二个“上下文”json 中获取“类型”键并获取键类型

for name in range(data.shape[0]):
        output_json=data['Request'][name]
        json_data=json.loads(output_json)
        try:
            parse_json=json.loads(json_data['Request'])
            value_to_insert=''
            for json_key in parse_json:
                value_to_insert+=str(json_key + '--'+ str(parse_json[json_key])+', '+'\n')

但是我的代码并没有将数据框系列更改为正确的 json 格式,而且迭代整个行也需要很多时间。任何关于优化解决方案的想法将不胜感激

【问题讨论】:

    标签: json python-3.x pandas


    【解决方案1】:

    尽量避免循环。即使您正在循环使用 pandas 的 DataFrame.iterrows 来执行此操作。对于大多数情况下,提取或更新DataFrame.apply 是最好的。

    如果请求列是字符串类型,那么你可以这样做

    import json
    data['Request'] = data['Request'].apply(lambda x: json.loads(x).get("Context",{}).get("type"))
    

    如果您的请求列可以是None,那么您应该这样做

    import json
    data['Request'] = data['Request'].apply(lambda x: json.loads(x).get("Context",{}).get("type") if x else None)
    

    编辑: 看起来你在Context 中有一个字符串,你必须解析多次

    import json
    data['Request'] = data['Request'].apply(lambda x: json.loads(json.loads(x).get("Context","{}")).get("type") if x else None)
    

    【讨论】:

    • @jezrael 是的,在大多数情况下。如果你小心,它可以给你改进。我倾向于关注stackoverflow.com/questions/24870953/…。我可能应该稍微改变一下措辞。
    • 我尝试了你提出的解决方案,但是在运行时我得到了AttributeError: 'str' object has no attribute 'get' 然后我添加了异常,但它仍然没有运行任何行。
    • 有没有按预期得到输出
    • @SachinKumar 看起来你在Context 中输入了字符串,我已经更新了解析两次的答案,试试看
    • 我尝试了你的解析方法两次,但它抛出的 json 解码错误JSONDecodeError: Expecting value: line 1 column 1 (char 0) 似乎解析两次有问题..试图获得任何突破来解析嵌套的 jsons
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多