Как индекс находится вне диапазона в этом случае?

#python #regex #pandas #dataframe #data-cleaning

#python #регулярное выражение #панды #фрейм данных #очистка данных

Вопрос:

Я пытаюсь создать функцию, которая заменяет столбец даты фрейма данных регулярным выражением.

 # import regex
import re

# create a copy of data
data2 = data
loop = len(data2) - data['Date of Publication'].isna().sum()
for i in range (loop):
   if (pd.notna(data2.loc[i]["Date of Publication"])):

        # copy the content of the date into old-value
        old_value = data2.loc[i]["Date of Publication"]

        # regex to match the first 4 digits of the old_value
        new_value = re.findall("d{4}", str(old_value))

        # replace the old value
        data2.loc[i, 'Date of Publication'] = new_value[0]
  

выдает ошибку

 IndexError                                Traceback (most recent call last)
<ipython-input-66-be514cf910bf> in <module>()
     15 
     16         # replace the old value
---> 17         data2.loc[i, 'Date of Publication'] = new_value[0]
     18 

IndexError: list index out of range
  

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

1. Поскольку это не программа, которую мы можем запустить, это просто предположение, но new_value в нем что-то есть? Что делать, если re.findall("d{4}", str(old_value)) ничего не находит?

2. Вы могли бы попробовать data2.loc[i:, 'Date of Publication'] = new_value[0] . Я только что добавил двоеточие.

Ответ №1:

В python data2.loc[a, b] это не то же самое, что data2.loc[a][b] . В вашей последней строке кода используется неправильная форма индексации.

data2.loc[a,b] это сокращение для data2.loc[(a, b)] , при этом индекс представляет собой один кортеж. Numpy может сбить вас с толку, потому что он проверяет, является ли индекс кортежем, и обрабатывает его ожидаемым образом.