Чтение json как мультииндексного фрейма данных - PullRequest
0 голосов
/ 03 мая 2020

У меня есть json, который включает в себя вот так.

[
    {
        "bi-document-identifier": "USA",
        "text": "I found somwthing Interesting",
        "relation_type": "ImportanceRelation",
        "annotation_type": "Opinionholder",
        "relation_start": {
            "annotatedtext": "We",
            "annotatedtext_represents": "OpinionHolder",
            "annotatedtext_startposition": 146,
            "annotatedtext_endposition": 148
        },
        "relation_end": {
            "annotatedtext": "information",
            "annotatedtext_represents": "StanceTarget",
            "annotatedtext_startposition": 239,
            "annotatedtext_endposition": 250
        }
    },
    {
        "bi-document-identifier": "USB",
        "text": "This is quite new to me",
        "relation_type": "ImportanceRelation",
        "annotation_type": "Opinionholder",
        "relation_start": {
            "annotatedtext": "Dr. A_PERSON",
            "annotatedtext_represents": "OpinionHolder",
            "annotatedtext_startposition": 0,
            "annotatedtext_endposition": 12
        },
        "relation_end": {
            "annotatedtext": "MOA of CV risk reduction",
            "annotatedtext_represents": "StanceTarget",
            "annotatedtext_startposition": 29,
            "annotatedtext_endposition": 53
        }
    }
]

, как читать как мульти-заголовочный фрейм данных. Опции orient и typ в pandas .read_ json () приводят к некоторым ошибкам, как показано ниже

TypeError: list indices must be integers or slices, not str

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Начните с read_ json с записями ориентация:

df = pd.read_json('Input.json', orient='records')

Затем преобразуйте оба столбца отношение в версию "MultiIndexed" :

d = { tt: df[tt].apply(pd.Series) for tt in ['relation_start', 'relation_end'] }
wrk1 = pd.concat(d, axis=1, keys=d.keys())

Добавленный уровень MultiIndex - это уровень top ( Relations_start и Relations_end ), а индексные ключи в исходных значениях становятся вторыми level.

Третий шаг - преобразование 4 начальных столбцов, также в версию MultiIndex, но на этот раз добавленным уровнем является уровень second , содержащий только пустые строки:

wrk2 = df.iloc[:, 0:4]
wrk2.columns = pd.MultiIndex.from_product([wrk2.columns, ['']])

И последнее, что нужно сделать, это связать оба wrk DataFrames (в индексе):

result = wrk2.join(wrk1)

Или, если вы хотите более короткий код, не создавайте wrk1 (достаточно d ) и поместите соответствующее выражение в окончательную инструкцию:

result = wrk.join(pd.concat(d, axis=1, keys=d.keys()))

Примечание : json_normalize, предложенное в другое решение, несомненно, короче, но результат имеет индекс столбца plain (одноуровневый). Как я понял, вам нужно просто MultiIndex для столбцов.

1 голос
/ 03 мая 2020

Почему бы вам не использовать pandas 'json_normalize?

from pandas import json_normalize
df = json_normalize(data)
df.head(2)

В противном случае, это похоже на ваш указанный c вариант использования:

Создание таблицы с несколькими заголовками из JSON

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