Ошибка атрибута: объект ‘Series’ не имеет атрибута ‘iterrows’

#python-3.x #pandas #loops

#python-3.x #pandas #циклы #Серии #ошибка атрибута

Вопрос:

 accounts = pd.read_csv('C:/*******/New_export.txt', sep=",", dtype={'number': object})
accounts.columns = ["Number", "F"]

for i, j in accounts["Number"].iterrows(): #i represents the row(index number), j is the number
    if (str(j) == "27*******5"):
        print(accounts["F"][i], accounts["Number"][i])
  

Я получаю следующую ошибку:

 AttributeError: 'Series' object has no attribute 'iterrows'
  

Я не совсем понимаю ошибку, поскольку «accounts» — это фрейм данных pandas.

Ответ №1:

accounts["Number"] является объектом Series, а не фреймом данных. Либо выполните итерацию accounts.iterrows() и возьмите Number столбец из каждой строки, либо используйте Series.iteritems() метод.

Перебор фрейма данных:

 for i, row in accounts.iterrows():
    if str(row['Number']) == "27*******5":
        print(row["F"], row["Number"])
  

или более Series.iteritems() :

 for i, number in accounts['Number'].iteritems():
    if str(number) == "27*******5":
        print(accounts["F"][i], number)
  

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

1. Добавляя сюда комментарий, который iteritems не существует в более поздних версиях pandas. Например. в pandas 2 это называется items смотрите также ответ ниже

Ответ №2:

Чтобы выполнить итерацию по столбцу фрейма данных (например, accounts['Number'] ) или серии pandas, используйте items() , которая создает zip объект.

 for i, j in accounts["Number"].items():
#                             ^^^^^^^^^
    if (str(j) == "27*******5"):
        print(accounts["F"][i], accounts["Number"][i])
  

Тем не менее, повторение по столбцу требуется редко, поскольку существуют более быстрые способы фильтрации столбца. Например, для случая в OP фильтрация с использованием логической маски вместо предложения if приводит к тому же результату:

 print(accounts.loc[accounts["Number"].map(str) == "27*******5", ['F', 'Number']])