DataFrame无explode属性报错求助:调用函数却触发AttributeError
问题:调用DataFrame.explode()触发AttributeError
错误回溯信息
调用栈回溯(最近的调用优先): File "train_transformer_v5.py", line 782, in <module> main() File "train_transformer_v5.py", line 763, in main global_step, tr_loss, metrics_result = trainer.train(args) File "train_transformer_v5.py", line 451, in train tb_writer=self.tb_writer, global_step=self.global_step) File "/home/xianx/model/metrics_v5.py", line 596, in eval_metrics qps[thr] = metrics_calculator.map_and_compute_qp(pri_nodes[thr], node_mappings, primary_gt_data_path, args) File "/home/xianx/model/metrics_v5.py", line 353, in map_and_compute_qp qpv2 = self.compute_qp(pred_df, gt_data_path) File "/home/xianx/model/metrics_v5.py", line 358, in compute_qp pred_df = pred_df.explode('TextNodeId') File "/opt/conda/lib/python3.6/site-packages/pandas/core/generic.py", line 5067, in __getattr__ return object.__getattribute__(self, name) AttributeError: 'DataFrame'对象没有'explode'属性
当前环境版本信息
$ pip install pandas 因普通site-packages不可写,默认使用用户安装 已满足依赖:pandas位于/opt/conda/lib/python3.6/site-packages,版本0.24.2 已满足依赖:pytz>=2011k(来自pandas)位于/opt/conda/lib/python3.6/site-packages,版本2020.1 已满足依赖:python-dateutil>=2.5.0(来自pandas)位于/opt/conda/lib/python3.6/site-packages,版本2.8.1 已满足依赖:numpy>=1.12.0(来自pandas)位于/opt/conda/lib/python3.6/site-packages,版本1.19.1 已满足依赖:six>=1.5(来自python-dateutil>=2.5.0->pandas)位于/opt/conda/lib/python3.6/site-packages,版本1.15.0
相关代码片段
def compute_qp(self, pred_df, gt_data_path): pred_df = pred_df.explode('TextNodeId') ...
问题原因与解决方案
- 原因:pandas的
explode()方法是在0.25.0版本才正式引入的,你当前使用的pandas版本为0.24.2,不支持该方法,因此触发AttributeError。 - 解决方案1:升级pandas版本
执行命令升级到支持explode()的版本:
若权限不足,添加pip install --upgrade pandas>=0.25.0--user参数:pip install --user --upgrade pandas>=0.25.0 - 解决方案2:手动实现explode功能(不升级版本)
若无法升级pandas,可使用以下代码替代pred_df.explode('TextNodeId'),同时兼容后续版本升级:# 版本兼容写法,自动判断是否支持explode方法 if hasattr(pred_df, 'explode'): pred_df = pred_df.explode('TextNodeId') else: # 手动展开列表类型的列 pred_df = pred_df.assign(TextNodeId=pred_df['TextNodeId'].apply(lambda x: x if isinstance(x, list) else [x])) pred_df = pred_df.explode('TextNodeId')
内容的提问来源于stack exchange,提问作者wheeeee
相关产品推荐
相关产品推荐

