#python #pandas #dictionary #reshape
#питон #pandas #словарь #изменить форму
Вопрос:
У меня есть фрейм данных pandas, который имеет dict в качестве значений. Я хотел бы преобразовать этот фрейм данных в формат ожидаемого результата.
и я хочу разделить столбцы на каждый ключ 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
вы просто предварительно обрабатываете данные и знаете, что в них есть, поэтому вам не нужно писать идеально автоматизированный код для фильтрации набора данных, если только вы не создаете конвейер и не хотите, чтобы он работал для любого типа ввода