Ошибка ключа Pandas при поиске ключевого слова в «ячейке»

#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]. Это тоже приводит к той же ошибке ключа.