Разделите вложенный столбец на новые столбцы

#python #json #pandas #dictionary #nested

Вопрос:

В моем фрейме данных есть вложенный столбец (people_info), содержащий ячейки, подобные приведенному ниже образцу.

[{«institution»:»some_institution»,»startMonth»:1,»startYear»:2563,»course»:»any»,»id»:1111,»formation»:»any»,»endMonth»:12,»endYear»:2556,»status»:»complete»}]

Насколько я знаю, это можно решить с помощью концепций словаря/json.

Я пытаюсь разделить этот столбец на новые столбцы, учитывая, что каждый ключ этой вложенной ячейки будет новым столбцом с соответствующими значениями.

Я попытался json_normalize, но я получаю эту ошибку: «Ошибка атрибута: объект ‘str’ не имеет атрибутов «значения»»

Я попытался преобразовать эти ячейки в диктант, но мне так и не удалось заставить python понять, что «учреждение» — это ключ, а «some_institution» — это значение в этом созданном диктанте. Похоже, python понимает всю ячейку как строку.

Вы не могли бы мне помочь? Если я не совсем ясно выразился, пожалуйста, скажите мне. Ткс!

Ответ №1:

IIUC, должно сработать следующее:

Ввод

 df = pd.DataFrame({'col1':[1], 'col2':2, 'nested_column':'[{"institution":"some_institution","startMonth":1,"startYear":2563,"course":"any","id":1111,"formation":"any","endMonth":12,"endYear":2556,"status":"complete"}]'})

df

  col1  col2    nested_column
0    1     2    [{"institution":"some_institution","startMonth...
 

Процесс

 import json
df['nested_column_dict'] = df['nested_column'].transform(lambda x : json.loads(x)[0] if x is not np.nan else {})
df = pd.concat([df, pd.DataFrame.from_records(df['nested_column_dict'])], axis=1)
df.drop('nested_column_dict', axis=1, inplace=True)
 

Выход

  df

 col1   col2    nested_column                                           institution startMonth  startYear   course    id    formation   endMonth    endYear   status
0   1      2    [{"institution":"some_institution","startMonth...   some_institution         1      2563       any  1111          any         12       2556 complete
 

Ответ №2:

Может быть, это поможет.

импорт панд в качестве pd

данные = [{«учреждение»: «некоторое учреждение», «Месяц начала»:1, «Год начала»:2563, «курс»:»любой», «идентификатор»:1111, «образование»:»любой», «Конец месяца»:12, «Конец года»:2556, «статус»:»завершено»}]

l = далее(элемент для элемента в данных)

df = pd.Фрейм данных(l, индекс=[0])

df

Комментарии:

1. Tks за вашу помощь! Но это не сработало, потому что «[{» является частью текста ячейки в этом фрейме данных. Таким образом, функция работает неправильно, потому что python не понимает, что «данные» — это список словарей.