#python #pandas #keyerror
#Python #pandas #Ошибка ключа
Вопрос:
Я перебираю некоторые данные в фрейме данных pandas в поисках определенных ключевых слов, однако результирующий поиск по регулярным выражениям приводит к ошибке ключа: 19.
Я пытался извлечь данные из конкретной ячейки, поместить их в строковый объект и выполнить поиск по нему, но каждый раз, когда я пытаюсь указать что-либо, чтобы просмотреть данные в этом столбце, я получаю KeyError: 19.
Чтобы предварить мой пример кода, я извлек определенные фрагменты фрейма данных и поместил их в список списков. (Из этих фрагментов я сохранил все столбцы, которые были в исходном фрейме данных)
Вот пример итерации, которую я пытаюсь выполнить:
for eachGroup in mainList:
for lineItem in eachGroup:
if re.search(r'( keyword )', lineItem[19], re.I):
dostuff
Как вы могли догадаться, данные, в которых я ищу ключевые слова, — это столбец 19, в котором данные отформатированы следующим образом:
3/23/2019 11:32:0 3/23/2019 11:32:0 3/23/2019 14:3:0 CSG CHG H6 27 1464D Random Random Random 81
Все остальные попытки поиска ключевых слов в разных столбцах выполняются нормально без каких-либо ошибок. Почему только этот случай возвращает KeyError?
Чтобы добавить еще больше ясности, даже следующий код выдает ту же ошибку ключа:
for eachGroup in mainList:
for lineItem in eachGroup:
text = lineItem[19]
Ответ №1:
Вот момент WTF…
Вместо того, чтобы использовать интеллектуальный for
цикл Python, я решил быть более детальным и выполнять цикл с помощью while
цикла. Излишне говорить, что это сработало.
Приведенная ниже реализация кода устраняет проблему, хотя почему это происходит, я понятия не имею:
bigCount = len(mainList)
count = 0
while count < bigCount:
while smallCount < len(mainList[count]):
if re.search(r'( keyword )', mainList[count][smallCount][19], re.I):
dostuff
Ответ №2:
Попробуйте изменить re.search(r'( keyword )', lineItem[19], re.I):
на re.match('(.*)keyword(.*)', lineItem[19]):
. re.search
вернет соответствующий соответствующий объект, в то время re.match
как вернет логическое значение, которое вам нужно в операторе if. Суффикс и префикс (.*)
должны игнорировать любой другой символ слева или справа от строки. Надеюсь, это поможет.
Комментарии:
1. Хотя я благодарю вас за совет по регулярному выражению, ошибка связана с «LineItem[19]», поскольку я даже пытался установить string = LineItem[19]. Это тоже приводит к той же ошибке ключа.