Почему преобразование вложенного словаря Python в фрейм данных pandas приводит к ошибке «не имеет атрибута 'items'»?

У меня есть вложенный словарь, хранящийся в переменной nested_dict_variable. Словарь извлекается с помощью SPSS valueLabels Property (Python)

type(nested_dict_variable) приводит к dict.

print(nested_dict_variable) приводит к {0: {1.0: '1 - low', 2.0: '2', 3.0: '3', 4.0: '4', 5.0: '5 - high', 99.0: "99 - don't know"}, 1: {0.0: '0 - no', 1.0: '1 - yes'}, 2: {1.0: '1 - A', 2.0: '2 - B', 3.0: '3 - C'}}

Я пытаюсь преобразовать этот вложенный словарь в DataFrame pandas, но получаю следующую ошибку. Я не понимаю, почему возникает эта ошибка атрибута, учитывая, что nested_dict_variable является (или кажется) словарем!?

AttributeError                            Traceback (most recent call last)
File c:\mypythonfile.py:38
     36 data_list = []
     37 for outer_key, inner_dict in nested_dict_variable.items():
---> 38     for inner_key, value in inner_dict.items():
     39         data_list.append({'Outer Key': outer_key, 'Inner Key': inner_key, 'Value': value})
     41 df = pd.DataFrame(data_list)

AttributeError: 'ValueLabel' object has no attribute 'items'

Вот мой код:

# see: https://www.ibm.com/docs/en/spss-statistics/28.0.0?topic=programs-running-spss-statistics-from-external-python-process#d10392e74
import spss
# import pandas
import pandas as pd

# read spss-data
file = r"C:\SPSS-SampleData1.sav"
spss.Submit(
    f"""
GET FILE='{file}'.
"""
)

var_index = []
nested_dict_variable= {}

# initialise the handling of spss commands
spss.StartDataStep()

# access active dataset (the one that was read above)
datasetObj = spss.Dataset()

# get a list of variable objects
varListObj = datasetObj.varlist
for var in varListObj:
    var_index.append(var.index)
    nested_dict_variable[var.index] = var.valueLabels


spss.EndDataStep()


##### CREATE DATAFRAMES #####

# convert nested dictionary to Pandas DataFrame
data_list = []
for outer_key, inner_dict in nested_dict_variable.items():
    for inner_key, value in inner_dict.items():
        data_list.append({'Outer Key': outer_key, 'Inner Key': inner_key, 'Value': value})

df = pd.DataFrame(data_list)



# end spss process
spss.StopSPSS()

Каков результат type(nested_dict_variable)?

mozway 03.07.2024 14:58
type(nested_dict_variable) дает мне dict
xChillout 03.07.2024 15:00

Трудно воспроизвести вашу проблему без минимального воспроизводимого примераnested_dict_variable, но если у вас действительно есть тип dict, то у вас должен быть атрибут items.

mozway 03.07.2024 15:03

Не заставляйте нас перепечатывать ваш код с изображения. Пожалуйста, опубликуйте рабочий пример и пример, который вызывает ошибку, в виде обычного текста. Также, пожалуйста, опубликуйте полную трассировку ошибок, а не только последнюю строку.

John Gordon 03.07.2024 15:57

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

xChillout 04.07.2024 09:32

@mozway спасибо за ваш отзыв. возможно ли, что даже если dict возвращается, не будет типа dict?

xChillout 04.07.2024 09:34
var.valueLabels может выглядеть как диктант, но это не диктант. Просто у него плохо продуманная __repr__ реализация, из-за которой он выглядит таковым.
user2357112 04.07.2024 09:36

Вы проверили тип nested_dict_variable, но ошибка возникла не в nested_dict_variable. Ошибка произошла, когда вы попытались получить доступ к inner_dict.items, а не к nested_dict_variable.items.

user2357112 04.07.2024 09:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
8
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как отметил user2357112, var.valueLabels выглядит как dict, но это не так.

Я бегло просмотрел документацию этого пакета python spss и там написано:

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

varObj = datasetObj.varlist['origin']
for val, valLab in varObj.valueLabels.data.iteritems():
   print val, valLab

Итак, вы можете попробовать переписать свой код:

data_list = []
for outer_key, inner_dict in nested_dict_variable.items():
    for inner_key, value in inner_dict.data.iteritems():
        data_list.append({'Outer Key': outer_key, 'Inner Key': inner_key, 'Value': value})

Хотя я не пробовал. Удачи! ;)

большое спасибо. Мне пришлось изменить inner_dict.data.iteritems() на inner_dict.data.items(), потому что, очевидно, iteritems() был удален в python3 (который используется с SPSS28) и был заменен на items.

xChillout 04.07.2024 13:55

Другие вопросы по теме

Как заменить определенное поле внутри строки JSON в каждой строке файла csv в Python случайным значением?
Как создать иерархическую карту цветов в matplotlib?
Расширенная логика с группировкой, применением и преобразованием - сравнение значения строки с предыдущим значением и создание нового столбца
Каков самый быстрый способ расчета ежедневного баланса со сложными процентами в Pandas или Spark?
Я выбрал два столбца в объекте groupby. Как применить фильтр true или false к одному, а затем применить функцию к другому?
Выявляйте и отмечайте дубликаты, каждый из которых имеет определенное качество
Чтение CSV-файла с помощью Pandas в рабочей области Databricks
Применить функцию к двум столбцам pandas и назначить их обратно исходному фрейму данных, что вызовет предупреждение в будущем
Странное поведение при обновлении значений с использованием iloc в фрейме данных pandas
Как это описание понимается в документации pandas?