Pandas对DataFrame应用函数时出现axis相关报错如何解决?
报错原因
- 核心问题是
test_df.apply(..., axis=1)遍历每一行时,传入vanilla_vec_similarity的第一个参数x是Series类型,不是DataFrame。Series只有行索引(axis=0),不存在列轴(axis=1),所以调用x.drop('request_id', axis=1)时会直接触发axis不存在的报错。 - 次要问题:代码中
drop方法使用inplace=True时返回值为None,后续链式调用.values会触发属性不存在报错,只是当前axis错误先被抛出,还没走到这一步。 - 额外隐藏问题:
test_vec是单行DataFrame,未处理成一维数组的话,和Series转成的数组做等值判断时会出现形状不匹配的问题。
修复方案
修改函数逻辑、移除inplace用法,提前处理固定的对比向量即可,参考代码如下:
import pandas as pd import numpy as np def vanilla_vec_similarity(x, y_arr): # 直接过滤掉request_id字段,无需修改原对象、无需指定axis x_arr = x.drop('request_id').values return (x_arr == y_arr).mean() test_df = pd.DataFrame({'request_id': [55, 42, 13], 'a': ['x','y','z'], 'b':[1,2,3], 'c': [1.0, -1.8, 19.113]}) test_vec = pd.DataFrame([[123,'x',1.1, -1.8]], columns=['request_id', 'a', 'b', 'c']) # 提前把对比向量处理成一维数组,避免每次apply重复计算 test_vec_arr = test_vec.drop('request_id', axis=1).values.flatten() test_df['similarity'] = test_df.apply(lambda x: vanilla_vec_similarity(x, test_vec_arr), axis=1)
内容的提问来源于stack exchange,提问作者SteveS
相关产品推荐
相关产品推荐

