Плохой шаблон - извлекать все столбцы и затем получать соответствующий элемент из каждой такой переменной (удерживая один столбец).
Используйте скорее следующий шаблон:
for idx, row in email_list.iterrows():
row.Role
row['Staff Name']
Если вы не используете idx
, вместо этого ставьте _
.
Этот вариант намного быстрее, чем ваш. Приведенный выше код фактически выполняет здесь одну итерацию (по строкам), тогда как ваш код выполняет:
- также одну итерацию по номерам строк,
- , но затем Ваш код выполняет n поисков для отдельного элемента с определенным индексом в каждом столбце .
Давайте вернемся к моему примеру кода. Существует 2 варианта доступа к элементу текущей строки:
row.Role
- если имя столбца не содержит "специальных" символов (например, пробелов). row['Staff Name']
- в других (более сложных) случаях.
И причина, по которой вы получаете KeyError: 0 .
Обратите внимание:
- ваши строки имеют индексы, начинающиеся с 1 (крайний левый столбец без заголовка),
- , но в вашем l oop idx начинается с 0 ,
- Доступ к каждой "переменной столбца" на самом деле просто по значению индекса , а не по целочисленной позиции элемента "wanted".
Итак, ошибка возникает при самом первом повороте вашего l oop, когда у вас:
- есть idx == 0 ,
- переменная столбца (фактически Series ) не содержит элемент с индексом == 0 .
На самом деле Pandas использует здесь 2 разных имени ( Key и index index ) fo Это одно и то же, поэтому открыто для обсуждения, в какой степени это сообщение доступно для чтения. Вы ничего не можете с этим поделать. Вам просто нужно это знать.
Или, если вы по какой-то причине хотите остаться в соответствии с текущей версией вашего кода, измените только инструкцию для на:
for idx in range(1, len(email_list) + 1):
...
Тогда это l oop начнется с idx == 1 , и ошибка не должна возникать, если у вас есть индекс как последовательных чисел, начиная с 1.
Но, как я заметил, ваш индекс:
- начинается с 1 , 2 и 3 (пока все хорошо) ),
- но тогда есть "пробел", у вас нет строки с индексом 4 .