【问题标题】:Converting json file with comments into dataframe using Python使用Python将带有注释的json文件转换为数据框
【发布时间】:2019-07-27 06:53:50
【问题描述】:

我有一个以下格式的 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 文件以不包含 cmets):

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!

谁能帮忙?

【问题讨论】:

  • 为什么要将对象存储在 JSON 文件中?对象应先解析成 JSON 格式。
  • 这不是一个有效的 JSON 文件。不允许注释,文件应该是一个对象或数组。如果要存储多个对象,则应将它们包装在一个数组中。
  • 对象的末尾还有一个额外的,ABCCDE 需要用引号引起来,而且大括号不匹配。
  • ISODate("2016-02-20T12:36:40.226Z") 不是有效的 JSON -- JSON 没有函数调用。
  • 如果你需要处理这个,你需要编写一个自定义解析器。它有很多问题,你无法使用标准的 JSON 解析器。

标签: python json python-3.x dataframe


【解决方案1】:

正如一些 cmets 所指出的,这不是一个有效的 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,但如果您无法做到这一点,则可以在 pd.read_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。它还会使您的数据变得混乱,因为这意味着您将列的行的属性存储在索引中,这意味着您需要为每个输入类别创建一个单独的列,或者您只有一个输入类别并且它不必要地令人困惑。您最好有一个列来表示该行的观察是文本还是其他类型,或者更好地确保您的输入类型与可以存储为元数据的既定数据类型相匹配,但我离题了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 2019-07-15
    • 2020-05-29
    • 2020-02-29
    • 2021-12-04
    相关资源
    最近更新 更多