#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]
. Это создает новый столбец в панд. Второй вопрос я не понимаю.