'pandas._libs.properties.AxisProperty' object is not iterable

weamagic

Пользователь
Пользователь
Июл 11, 2020
149
13
18
Python 12, Win 10
Добрый день. Есть кусок кода (приложен ниже), который долгое время нормально работал, но потом стала вылезать вот такая ошибка в строке
Python:
for j in k
. Подскажите, что я упускаю? Уже неделю смотрю и не вижу ошибки.
Python:
            nk = prj_base[i]
            first_lvl = QtWidgets.QTreeWidgetItem()
            first_lvl.setText(0, str(i))
            self.tree_prj.addTopLevelItem(first_lvl)
            if nk != pd.DataFrame:
                k = nk.keys()
            else:
                if nk.empty != True:
                    k = nk.columns
            if k != []:
                for j in k:
                    sec_lvl = QtWidgets.QTreeWidgetItem()
                    first_lvl.addChild(sec_lvl)
                    sec_lvl.setText(0, str(j))
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 648
472
83
что внутри k ?
сделайте логирование, посмотрите что в j при ошибке
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
149
13
18
что внутри k ?
сделайте логирование, посмотрите что в j при ошибке
Если я правильно понял, то он даже в цикл не заходит - сразу вываливается с этой ошибкой.
 

PYDEV

Пользователь
Пользователь
Авг 31, 2023
64
16
8
Принтаните
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
149
13
18
Модифицировал код вот так:
Python:
            nk = prj_base[i]
            first_lvl = QtWidgets.QTreeWidgetItem()
            first_lvl.setText(0, str(i))
            self.tree_prj.addTopLevelItem(first_lvl)
            if nk != pd.DataFrame:
                k = nk.keys()
            else:
                if nk.empty != True:
                    k = nk.columns
            print(k)
            if k != []:
                for j in k:
                    print(j)
                    sec_lvl = QtWidgets.QTreeWidgetItem()
                    first_lvl.addChild(sec_lvl)
                    sec_lvl.setText(0, str(j))

Результаты принтов:
Код:
dict_keys([])
dict_keys([])
dict_keys([])
dict_keys([])
<pandas._libs.properties.AxisProperty object at 0x00000255A9BA5DB0>
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 648
472
83
Модифицировал код вот так:
Python:
            nk = prj_base[i]
            first_lvl = QtWidgets.QTreeWidgetItem()
            first_lvl.setText(0, str(i))
            self.tree_prj.addTopLevelItem(first_lvl)
            if nk != pd.DataFrame:
                k = nk.keys()
            else:
                if nk.empty != True:
                    k = nk.columns
            print(k)
            if k != []:
                for j in k:
                    print(j)
                    sec_lvl = QtWidgets.QTreeWidgetItem()
                    first_lvl.addChild(sec_lvl)
                    sec_lvl.setText(0, str(j))

Результаты принтов:
Код:
dict_keys([])
dict_keys([])
dict_keys([])
dict_keys([])
<pandas._libs.properties.AxisProperty object at 0x00000255A9BA5DB0>
в k у вас элемент pandas._libs.properties.AxisProperty, и вы пытаетесь итерироваться по нему
если правильно понял, в этом ошибка, что то не то пишется в k
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
149
13
18
в k у вас элемент pandas._libs.properties.AxisProperty, и вы пытаетесь итерироваться по нему
если правильно понял, в этом ошибка, что то не то пишется в k
Привожу полный код:
Python:
base = {'Sensor': {}, 'Group': {}, 'Line': {}, 'Data_inp': pd.DataFrame, 'Data_out': pd.DataFrame}
        global base
        for i in base.keys():
            nk = base[i]
            first_lvl = QtWidgets.QTreeWidgetItem()
            first_lvl.setText(0, str(i))
            self.tree_prj.addTopLevelItem(first_lvl)
            if nk != pd.DataFrame:
                k = nk.keys()
            else:
                if nk.empty != True:
                    k = nk.columns
            print(k)
            if k != []:
                for j in k:
                    print(j)
                    sec_lvl = QtWidgets.QTreeWidgetItem()
                    first_lvl.addChild(sec_lvl)
                    sec_lvl.setText(0, str(j))
Это считывание базы, когда она ещё пустая, до того, как в неё что-то запишут.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 648
472
83
Привожу полный код:
Python:
base = {'Sensor': {}, 'Group': {}, 'Line': {}, 'Data_inp': pd.DataFrame, 'Data_out': pd.DataFrame}
        global base
        for i in base.keys():
            nk = base[i]
            first_lvl = QtWidgets.QTreeWidgetItem()
            first_lvl.setText(0, str(i))
            self.tree_prj.addTopLevelItem(first_lvl)
            if nk != pd.DataFrame:
                k = nk.keys()
            else:
                if nk.empty != True:
                    k = nk.columns
            print(k)
            if k != []:
                for j in k:
                    print(j)
                    sec_lvl = QtWidgets.QTreeWidgetItem()
                    first_lvl.addChild(sec_lvl)
                    sec_lvl.setText(0, str(j))
Это считывание базы, когда она ещё пустая, до того, как в неё что-то запишут.
print(k) что показывает?
дебагером пройдитесь, посмотрите все действия, что происходит
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
149
13
18
print k что показывает?
<pandas._libs.properties.AxisProperty object at 0x0000029D38714E50>. Откуда он там взялся - не понимаю.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 648
472
83
<pandas._libs.properties.AxisProperty object at 0x0000029D38714E50>. Откуда он там взялся - не понимаю.
отсюда наверное
Python:
if nk.empty != True:
    k = nk.columns
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
149
13
18
отсюда наверное
Python:
if nk.empty != True:
    k = nk.columns
Это же должен быть список столбцов? Если нет столбцов, то он пуст. Или ошибаюсь?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 648
472
83
Это же должен быть список столбцов? Если нет столбцов, то он пуст. Или ошибаюсь?
не знаток pandas, но он наверное делает пустой датафрейм, соответственно там есть колонки, они просто пустые

Python:
import pandas as pd

dt = pd.DataFrame

print(dt.columns) # <pandas._libs.properties.AxisProperty object at 0x00000193F9D2D360>
 

PYDEV

Пользователь
Пользователь
Авг 31, 2023
64
16
8
Это же ссылка на объект, нет? Попробуйте просто list(k)
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 648
472
83
Это же ссылка на объект, нет? Попробуйте просто list(k)
ну если ссылка есть, значит колонки есть, ТС думал не так
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
149
13
18
Это же ссылка на объект, нет? Попробуйте просто list(k)
'type' object is not iterable
Код теперь выглядит так:
Python:
        for i in base.keys():
            nk = prj_base[i]
            first_lvl = QtWidgets.QTreeWidgetItem()
            first_lvl.setText(0, str(i))
            self.tree_prj.addTopLevelItem(first_lvl)
            print(type(nk))
            if nk != pd.DataFrame:
                k = nk.keys()
            else:
                k = list(nk)
            print(k)
            if k != []:
                for j in k:
                    print(j)
                    sec_lvl = QtWidgets.QTreeWidgetItem()
                    first_lvl.addChild(sec_lvl)
                    sec_lvl.setText(0, str(j))
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
149
13
18
не знаток pandas, но он наверное делает пустой датафрейм, соответственно там есть колонки, они просто пустые

Python:
import pandas as pd

dt = pd.DataFrame

print(dt.columns) # <pandas._libs.properties.AxisProperty object at 0x00000193F9D2D360>
да я тоже больше по регрессиям и обработке сигналов, чем по вот этим вещам.
 

Форум IT Специалистов