Изменить форму фрейма данных pandas, который имеет dict в качестве значений

#python #pandas #dictionary #reshape

#питон #pandas #словарь #изменить форму

Вопрос:

У меня есть фрейм данных pandas, который имеет dict в качестве значений. Я хотел бы преобразовать этот фрейм данных в формат ожидаемого результата.

изображение df, которое у меня есть

и я хочу разделить столбцы на каждый ключ dict. Например, для первых столбцов «анкета» мне нужны «анкета.шаг», «анкета.lastCompletedStep» и так далее.

проблема здесь в том, что нормализация json не работает:

 json_normalize(data=data)
 

кто-нибудь знает, как это исправить?

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

1. Предложенный вопросник столбца не содержит согласованных данных, в нем нет никаких и пустых значений. Что вы планируете с ними делать? json_normalize — это преобразование необработанных данных json в pandas. Как и в случае с front, вы можете перебирать строки, добавлять их в список и преобразовывать его в формат json (т. Е. Вам нужен согласованный формат JSON, ни один из них не разрешен) и использовать json_normalize для преобразования данных в dataframe.

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

3. ожидаемый результат представляет собой фрейм данных со столбцами всех ключей ur dict в каждом столбце. Например, для анкеты мне нужно иметь ‘questionnaire.step’, ‘questionnaire.lastCompletedStep’ со значением определенных ключей. В случае, если это None, мне также нужны столбцы тезисов со значениями None. И это большая проблема. Потому что мне нужны столбцы тезисов для значений None. Таким образом, мы должны проверить другую строку, содержащую dict (а не пустой dict), чтобы узнать, какие столбцы я должен создать.

Ответ №1:

Является ли значение столбца в формате type string ? Если это так, вы можете попробовать это. Я попробовал это на фрейме данных, и это сработало. Перебирайте значения каждого столбца, преобразуйте их из str в dict , затем перебирайте эти значения, создайте новый столбец со значением ключа и присвоите значение столбцу.

 data  =  [str({"step": 7, "lastCompletedStep": 7})]
df = pd.DataFrame(data, columns=["questionaire"])
df
 

введите описание изображения здесь

 dataval = df.questionaire[0]
print(type(dataval))
 

введите описание изображения здесь

 result = eval(dataval)
print(result)
print(type(result))
 

введите описание изображения здесь

 for i,(k, v) in enumerate(result.items()):
df["questionaire" "." str(k)] = v
df
 

введите описание изображения здесь

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

1. Это не ожидаемый результат! На самом деле я хочу разделить dict на фрейм данных, в котором есть столбцы [‘questionnaire.step’, ‘questionnaire.lastCompletedStep’, …] . Столбцы ссылаются на ключи dict, которые находятся на значении столбцов questionnaire. Но иногда это None, а иногда это просто пустой dict {} . Это мутное объяснение?

2. Итак, вы хотите использовать ключ в качестве имени столбца, а затем присвоить строке соответствующее значение?

3. Я предполагаю, что мое редактирование будет тем, чего вы ожидаете.

4. Да, вывод хорош для 1 строки, в которой есть dict, но в моем фрейме данных много строк без значения. Поэтому мне нужно проверить, является ли это значение dict или None. если это None, то я должен указать None во всех столбцах, которые я создаю из «вопросника». Итак, для этой строки мне нужно иметь «None» в «questionnaire.step» и «questionnaire.lastCompletedStep». Но в этой строке у нас нет информации о ключах, которые нам нужны, потому что в первой строке у нас их нет.

5. Вы можете жестко запрограммировать if statement указание, если есть None , то df["questionaire.step"].insert=None df["questionaire.lastCompletedStep"].insert=None вы просто предварительно обрабатываете данные и знаете, что в них есть, поэтому вам не нужно писать идеально автоматизированный код для фильтрации набора данных, если только вы не создаете конвейер и не хотите, чтобы он работал для любого типа ввода