Pandas字符串处理报错:调用str.upper时PandasArray无_str_upper属性
本地pandas字符串操作触发属性缺失报错
问题复现
运行以下最简示例代码即可稳定复现错误:
import pandas as pd names = ["first name", "second name", "third name"] numbers = [1,2,3] data = { "name": names, "number": numbers } df = pd.DataFrame(data) print(df["name"].str.upper())
程序运行时抛出完整堆栈:
Traceback (most recent call last): File "C:/Python/Udemy/pandas/main.py", line 12, in <module> print(df["name"].str.upper()) File "C:\Users\saxal\AppData\Local\r-miniconda\lib\site-packages\pandas\core\strings\accessor.py", line 101, in wrapper return func(self, *args, **kwargs) File "C:\Users\saxal\AppData\Local\r-miniconda\lib\site-packages\pandas\core\strings\accessor.py", line 2686, in upper result = self._array._str_upper() AttributeError: 'PandasArray' object has no attribute '_str_upper'
已排查信息
- 已反复切换安装不同版本的numpy、pandas,本地问题始终未解决
- 完全相同的代码上传到repl.it等在线运行平台,可正常输出预期的大写字符串列结果
- 当前本地环境使用的依赖版本为:pandas 1.2.0、numpy 1.19.5
- 运行环境为r-miniconda预装的Python解释器
问题根因与解决方向
- 该报错属于pandas 1.2.0版本的已知兼容缺陷:内置字符串访问器在调用核心处理方法时,未将
_str_upper等字符串操作方法正确绑定到PandasArray类对象上,尤其在r-miniconda这类预装了基础依赖的打包环境中,容易出现新旧版本pandas文件交叉覆盖、残留缓存的问题——就算反复执行安装命令切换版本,只要旧的源码残留在site-packages目录里,就会持续触发这个属性缺失的报错。 - 具体修复步骤:
- 先彻底卸载当前环境的pandas,执行命令:
pip uninstall pandas -y - 卸载完成后,手动打开Python对应的site-packages目录,确认删除所有残留的pandas相关文件夹,包括
pandas源码目录、pandas-*.dist-info版本信息目录,避免旧文件干扰新安装的包。 - 安装和numpy 1.19.5兼容性最优的稳定pandas版本1.3.5,执行安装命令:
pip install pandas==1.3.5
- 先彻底卸载当前环境的pandas,执行命令:
- 临时绕过方案(如果不想更换pandas版本):
不使用pandas自带的.str访问器,改用列表推导式直接对列内的原生字符串做大写转换,写法如下:# 替代 df["name"].str.upper() df["name"] = [item.upper() for item in df["name"]] print(df["name"])
内容的提问来源于stack exchange,提问作者Alexander Sax
相关产品推荐
相关产品推荐

