使用Python将带注释的json文件转换为dataframe

2024-09-29 05:32:36 发布

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

我有一个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")
}

我想创建以下格式的dataframe,但我不知道怎么做(我不确定您是否需要清理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!

有人能帮忙吗?你知道吗


Tags: 文件textauthidinputoutputthat格式
1条回答
网友
1楼 · 发布于 2024-09-29 05:32:36

正如一些评论所指出的,这不是一个有效的json。如果你能得到正确的格式,那么熊猫有pd.read\u json文件可以直接用作数据帧构造函数。这是正确的做法。您可以构建一个定制的解析器,但它的效率远远低于让您的数据以pandas可以立即解析的标准格式分发。如果像您提到的那样来自MongoDB,Mongo有一个内置的json实用程序来解析它的数据,那么您可以使用它的shell特性获得正确的输出。下面的链接有一些细节。 https://docs.mongodb.com/manual/reference/mongodb-extended-json/

如果无法获得正确的格式,则需要将json解析为csv,并将read\csv sep参数传递给与文档格式匹配的regex。第一个链接显示了这样做的示例。第二个链接是使用正则表达式解析文本的教程,它将帮助您生成模式。第三个链接是关于regex的w3schools教程,其中有一个关于regex序列和用法的很好的参考部分。您需要找到一种消除ISODate调用的方法,然后可以使用pandas来确保列的datetime格式正确,但是解析它需要将这些元素视为字符串而不是函数。记住,我认为最好是让mongo吐出一个实际的json,而不是乱七八糟的东西,但是如果你不能做到这一点,那么在pd.read\U csv文件功能才是出路。你知道吗

Create pandas dataframe from json objects

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。它还会使数据变得混乱,因为这意味着您将列的行的属性存储在索引中,这意味着您需要为每个输入类别使用一个单独的列,或者您只有一个输入类别,这会造成不必要的混乱。最好有一个列来指示行的观察值是文本还是其他类型,或者更好的是确保输入类型与可以存储为元数据的已建立数据类型匹配,但我离题了。你知道吗

相关问题 更多 >