Преобразование файла json с комментариями в фрейм данных с использованием Python - PullRequest
0 голосов
/ 05 марта 2019

У меня есть файл 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!

Может кто-нибудь помочь?

1 Ответ

1 голос
/ 05 марта 2019

Как отмечается в некоторых комментариях, это недопустимый JSON. Если вы можете получить правильное форматирование, то у pandas есть pd.read_json, который вы можете использовать непосредственно в качестве конструктора dataframe. Это правильная вещь. Вы можете создать собственный анализатор, но он гораздо менее эффективен, чем распространение ваших данных в стандартизированном формате, который панды могут немедленно проанализировать. Если это исходит от MongoDB, как вы упомянули, Mongo имеет встроенную утилиту json для анализа своих данных, вы можете получить правильный вывод, используя его функции оболочки. Ссылка ниже содержит некоторые подробности об этом. https://docs.mongodb.com/manual/reference/mongodb-extended-json/

Если вы не можете получить правильный формат, вам нужно, чтобы pandas проанализировал json как csv и передал параметру sep read_csv регулярное выражение, соответствующее шаблону формата вашего документа. Первая ссылка показывает пример этого. Вторая ссылка - на учебник по синтаксическому анализу текста с помощью регулярных выражений, он поможет вам сгенерировать шаблон. Третья ссылка - это учебник w3schools по регулярным выражениям, в котором есть хороший справочный раздел по последовательностям и использованию регулярных выражений. Вам нужно будет найти способ исключить вызовы ISODate, а затем вы можете использовать pandas, чтобы убедиться, что столбец имеет правильный формат даты и времени, но для анализа этого потребуется трактовать эти элементы как строки, а не функции. Помните, я думаю, что лучше просто заставить Монго выплюнуть настоящий json без беспорядка, но если вы не можете этого сделать, определите способ определения пользовательского парсера с помощью регулярных выражений внутри функции pd.read_csv.

Создание кадра данных pandas из объектов json

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

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

Краткое примечание: присвоение имен столбцам данных pandas таким образом, то есть «input ['type']», затеняет вызов для серии pandas. Если бы я проанализировал ваш файл во фрейме данных и затем захотел вызвать входной столбец, мне нужно было бы написать df ['input ["text"]'], что не является пифоническим. Это также создает беспорядок в ваших данных, потому что это означает, что вы храните атрибуты строк столбца внутри индекса, а это означает, что вам потребуется отдельный столбец для каждой категории ввода, или у вас есть только одна категория ввода, и это излишне запутывает. Вам лучше иметь столбец, в котором будет указано, является ли наблюдение строки текстовым или другим типом, или еще лучше убедиться, что ваши входные типы соответствуют установленному типу данных, который может быть сохранен как метаданные, но я отступаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...