首页 > 解决方案 > 使用Python将带有注释的json文件转换为数据框

问题描述

我有以下格式的 JSON 文件:

/* 1 */
{
    "input" : {
        "text" : "car"
    },
    "output" : {
        "text" : [ 
            "Sorry! I didn't understand. Please rephrase."
        ],
    },
        "Auth" : "You are authenticated",
        "Begin" : "Started",
        "ID" : "ABC"
    },
    "timestamp" : ISODate("2017-02-20T12:36:40.226Z"),
}
/* 2 */
{
    "input" : {
        "text" : "bat"
    },
    "output" : {
        "generic" : [ 
            {
                "response_type" : "text",
                "text" : "I understood that!"
            }
        ],
        "text" : [ 
            "I understood that!"
        ],
        "log_messages" : []
    },
        "Auth" : "You are authenticated",
        "Begin" : "Started",
        "ID" : "CDE"
    },
    "timestamp" : ISODate("2016-02-20T12:36:40.226Z")
}

我想创建以下格式的数据框,但我不知道该怎么做(我不确定您是否必须清理 json 文件以不包含注释):

ID     Date           Input["text"]    Output["text"]
ABC    2017-02-20     car              Sorry! I didn't understand. Please rephrase.
CDE    2016-02-20     bat              I understood that!

任何人都可以帮忙吗?

标签: pythonjsonpython-3.xdataframe

解决方案


正如一些评论所指出的,这不是一个有效的 json。如果您可以正确设置格式,则 pandas 具有 pd.read_json ,您可以直接将其用作数据帧构造函数。这是正确的做法。您可以构建一个自定义解析器,但它的效率低于将您的数据以 pandas 可以立即解析的标准化格式分发。如果这像您提到的那样来自 MongoDB,Mongo 具有用于解析其数据的内置 json 实用程序,您可以使用其 shell 功能获得正确的输出。下面的链接对此有一些详细信息。 https://docs.mongodb.com/manual/reference/mongodb-extended-json/

如果您无法获得正确的格式,则需要让 pandas 将 json 解析为 csv 并将 read_csv sep 参数传递给模式与文档格式匹配的正则表达式。第一个链接显示了一个这样做的例子。第二个链接是使用正则表达式解析文本的教程,它将帮助您生成模式。第三个链接是关于正则表达式的 w3schools 教程,其中有一个关于正则表达式序列和用法的很好的参考部分。您需要找到一种方法来消除 ISODate 调用,然后您可以使用 pandas 来确保该列采用正确的日期时间格式,但是解析这将需要将这些元素视为字符串而不是函数。请记住,我认为最好让 mongo 吐出一个没有乱七八糟的实际 json,但如果你不能想象这样做,

从 json 对象创建 pandas 数据框

https://www.vipinajayakumar.com/parsing-text-with-python/

https://www.w3schools.com/python/python_regex.asp#matchobject

快速说明:以这种方式命名 pandas 数据框列,即“input['type']”,会影响对 pandas 系列的调用。如果我将您的文件解析为一个数据框,然后想调用一个输入列,我需要编写 df['input["text"]'] 这不是 pythonic。它还会弄乱您的数据,因为这意味着您将列的行的属性存储在索引中,这意味着您需要为每个输入类别创建一个单独的列,或者您只有一个输入类别并且它不必要地令人困惑。您最好有一个列来表示该行的观察是文本还是其他类型,或者更好地确保您的输入类型与可以存储为元数据的已建立数据类型相匹配,但我离题了。


推荐阅读