Фрейм данных Python применяется, вызывая ошибку «Индекс списка вне диапазона»

#python #dataframe #apply

Вопрос:

У меня есть фрейм данных, содержащий кучу URL-адресов PDF-файлов. Я хочу извлечь имена файлов в отдельную колонку. Я попробовал это на MWE, и это работает, но мой основной набор данных выдает мне эту ошибку. Может кто-нибудь, пожалуйста, помочь мне понять, в чем может быть причина ошибки

МВЕ

 my_dict = {"url": ["http://www.someting.com/file/file1.pdf", "http://www.someting.com/file/file37.pdf"]} my_test_df = pd.DataFrame.from_dict(my_dict)  def get_filename_from_url(url):   #Commenting out a bunch of stuff because my final goal is to do NLP on the extracted text   #response = requests.get(url)  #my_raw_data = response.content   m = re.search('[^/] 

Это работает, и мой DF выглядит так, как я и ожидал.

введите описание изображения здесь

Но для моего фактического фрейма данных,

введите описание изображения здесь

когда я это делаю, это работает:

введите описание изображения здесь

Но когда я пытаюсь применить, чтобы создать новый столбец, я получаю ошибку.

 my_main_df['File_name3'] = my_main_df.apply(lambda row: get_filename_from_url(row['PDF Links']),axis=1)  

Я получаю следующую ошибку. Я не понимаю, какой индекс списка путается:

 --------------------------------------------------------------------------- IndexError Traceback (most recent call last) lt;ipython-input-80-dd127df2eb83gt; in lt;modulegt; ----gt; 1 my_main_df['File_name3'] = my_main_df.apply(lambda row: get_filename_from_url(row['PDF Links']),axis=1)  ~Anaconda3libsite-packagespandascoreframe.py in __setitem__(self, key, value)  3161 else:  3162 # set column -gt; 3163 self._set_item(key, value)  3164   3165 def _setitem_slice(self, key: slice, value):  ~Anaconda3libsite-packagespandascoreframe.py in _set_item(self, key, value)  3244 # value exception to occur first  3245 if len(self): -gt; 3246 self._check_setitem_copy()  3247   3248 def _set_value(self, index, col, value, takeable: bool = False):  ~Anaconda3libsite-packagespandascoregeneric.py in _check_setitem_copy(self, stacklevel, t, force)  3935 raise com.SettingWithCopyError(t)  3936 elif value == "warn": -gt; 3937 warnings.warn(t, com.SettingWithCopyWarning, stacklevel=stacklevel)  3938   3939 def __delitem__(self, key) -gt; None:  ~Anaconda3libwarnings.py in _showwarnmsg(msg)  107 "function or method")  108  --gt; 109 sw(msg.message, msg.category, msg.filename, msg.lineno,  110 msg.file, msg.line)  111 return  ~Anaconda3libsite-packagesPyPDF2pdf.py in _showwarning(message, category, filename, lineno, file, line)  1067 file = sys.stderr  1068 try: -gt; 1069 file.write(formatWarning(message, category, filename, lineno, line))  1070 except IOError:  1071 pass  ~Anaconda3libsite-packagesPyPDF2utils.py in formatWarning(message, category, filename, lineno, line)  67 #custom implementation of warnings.formatwarning  68 def formatWarning(message, category, filename, lineno, line=None): ---gt; 69 file = filename.replace("/", "\").rsplit("\", 1)[1] # find the file name  70 return "%s: %s [%s:%s]n" % (category.__name__, message, file, lineno)  71   IndexError: list index out of range  

Обновить:

Когда я использую "head", чтобы по существу извлечь все строки моего основного фрейма данных, команда apply работает. Обратите внимание, что мой основной df содержит только 386 строк, поэтому head(400) в основном улавливает все строки.

введите описание изображения здесь

Команды на скриншоте выше, скопированные здесь. Я так растеряна.

 df2 = my_main_df.head(400) df2['File_name_test'] = df2.apply(lambda row: get_filename_from_url(row['PDF Links']),axis=1)  

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

1. попробуй, my_test_df['url'].str.split("/").str[-1] ?

2. @sushanth Спасибо. Два вопроса. 1. Как я могу сохранить эти выходные данные для создания нового столбца? То, что я делаю с apply to my_main_df.apply(лямбда x : my_fuc(x)), также работает, но как мне сохранить его в новом столбце? 2. Почему то, что я делаю, вызывает ошибку для моего основного DF, но не MWE?

3. Первый вопрос: Просто уходи my_test_df['column_name'] = my_test_df['url'].str.split("/").str[-1] . Это создает новый столбец в панд. Второй вопрос я не понимаю.

, url) if m is None: return None file_name = m.group(0) return file_name my_test_df['File_name'] = my_test_df.apply(lambda row: get_filename_from_url(row['url']),axis=1) Это работает, и мой DF выглядит так, как я и ожидал.

введите описание изображения здесь

Но для моего фактического фрейма данных,

введите описание изображения здесь

когда я это делаю, это работает:

введите описание изображения здесь

Но когда я пытаюсь применить, чтобы создать новый столбец, я получаю ошибку.


Я получаю следующую ошибку. Я не понимаю, какой индекс списка путается:


Обновить:

Когда я использую «head», чтобы по существу извлечь все строки моего основного фрейма данных, команда apply работает. Обратите внимание, что мой основной df содержит только 386 строк, поэтому head(400) в основном улавливает все строки.

введите описание изображения здесь

Команды на скриншоте выше, скопированные здесь. Я так растеряна.


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

1. попробуй, my_test_df['url'].str.split("/").str[-1] ?

2. @sushanth Спасибо. Два вопроса. 1. Как я могу сохранить эти выходные данные для создания нового столбца? То, что я делаю с apply to my_main_df.apply(лямбда x : my_fuc(x)), также работает, но как мне сохранить его в новом столбце? 2. Почему то, что я делаю, вызывает ошибку для моего основного DF, но не MWE?

3. Первый вопрос: Просто уходи my_test_df['column_name'] = my_test_df['url'].str.split("/").str[-1] . Это создает новый столбец в панд. Второй вопрос я не понимаю.