#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']])