У меня есть вложенный словарь, хранящийся в переменной 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)
дает мне dict
Трудно воспроизвести вашу проблему без минимального воспроизводимого примераnested_dict_variable
, но если у вас действительно есть тип dict
, то у вас должен быть атрибут items
.
Не заставляйте нас перепечатывать ваш код с изображения. Пожалуйста, опубликуйте рабочий пример и пример, который вызывает ошибку, в виде обычного текста. Также, пожалуйста, опубликуйте полную трассировку ошибок, а не только последнюю строку.
@JohnGordon спасибо за ваш отзыв. Я добавил полный код как нерабочий пример и полное сообщение об ошибке, которое я получаю. я также попытался улучшить вопрос/описание.
@mozway спасибо за ваш отзыв. возможно ли, что даже если dict
возвращается, не будет типа dict
?
var.valueLabels
может выглядеть как диктант, но это не диктант. Просто у него плохо продуманная __repr__
реализация, из-за которой он выглядит таковым.
Вы проверили тип nested_dict_variable
, но ошибка возникла не в nested_dict_variable
. Ошибка произошла, когда вы попытались получить доступ к inner_dict.items
, а не к nested_dict_variable.items
.
Как отметил 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
.
Каков результат
type(nested_dict_variable)
?