Pandas DataFrame apply提取PDF URL文件名时报List index out of range错误
错误根源
你的文件名提取代码本身没有问题,报错是PyPDF2旧版本的已知bug触发的:
- 你当前操作的
my_main_df是之前通过切片、过滤等操作生成的DataFrame视图(不是独立副本),给它新增列时pandas会触发SettingWithCopyWarning警告 - 旧版本PyPDF2覆写了Python全局的警告格式化函数,这个函数在处理警告路径时没有做边界判断,当路径字符串没有
\分隔符时,rsplit("\\", 1)返回的列表长度为1,直接取下标[1]就会触发IndexError。
为什么head(400)后运行正常
head(400)返回的是全新的独立DataFrame,不是原数据集的视图,新增列时不会触发SettingWithCopyWarning,自然不会走到PyPDF2的错误警告处理逻辑中。
解决方案
你可以任选以下一种方式解决:
- 生成
my_main_df时显式调用.copy()生成独立副本,避免触发切片警告,示例:# 你原来生成my_main_df的逻辑后面加.copy() my_main_df = 原查询/过滤逻辑.copy() - 升级PyPDF2到最新版本,该bug在后续版本中已经被修复
- 临时规避可以在赋值操作前关闭切片警告,操作完后恢复即可:
# 临时关闭警告 pd.options.mode.chained_assignment = None my_main_df['File_name3'] = my_main_df.apply(lambda row: get_filename_from_url(row['PDF Links']),axis=1) # 恢复默认警告设置 pd.options.mode.chained_assignment = 'warn'
内容的提问来源于stack exchange,提问作者Amatya
相关产品推荐
相关产品推荐

