如何将pandas DataFrame剔除id列的所有行传入get_similar_row函数的rows参数?
自动从DataFrame传入函数的实现方案
核心操作逻辑
- 按照规则跳过
id列:从DataFrame中剔除id列,将剩余所有特征的行转为二维数组格式,直接作为函数的rows入参传入,完全不需要手动拼接数值。 - 目标行的提取:从DataFrame中筛选出对应目标id的行,同样剔除
id列后转为一维数组,作为函数的target入参传入。 - 索引匹配规则:原函数返回的是传入
rows数组的位置索引,该索引和剔除id列后的DataFrame行号完全对应,可直接回溯原DataFrame的完整行信息。
完整可运行代码
import numpy as np import pandas as pd from sklearn.metrics.pairwise import cosine_similarity # 原相似度计算函数 def get_similar_row(rows, target): """Return the index of the most similar row""" return np.argmax(cosine_similarity(rows, [target])) # 示例DataFrame df = pd.DataFrame({ 'id': [1191, 3251, 1641, 2133], 'size': [3, 2, 1, 3], 'numberOfPlants': [0, 1, 1, 0], 'balcony': [1, 0, 1, 0], 'available': [1, 0, 0, 1], 'publicTransport': [1, 0, 0, 1] }) # 构造rows入参:跳过id列,取所有行的特征值 rows_input = df.drop(columns=['id']).values # 构造target入参:对应目标行(id=2133)的特征值,跳过id列 target = df[df['id'] == 2133].drop(columns=['id']).iloc[0].values # 调用函数获取最相似行的位置索引 similar_row_pos = get_similar_row(rows_input, target) # 可直接通过索引获取最相似行的完整信息 similar_row = df.iloc[similar_row_pos]
注意事项
之前手动传入参数时,把id这类大数值标识纳入特征计算,会因为id的数值量级远大于其他0/1编码的业务特征,严重干扰余弦相似度的判断,跳过id列的计算结果才符合业务逻辑。
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

