Pandas计算DataFrame各行相对指定参考行距离并新增列
报错原因
sklearn.metrics.pairwise_distances 的输入参数必须为二维数组,格式要求是(样本数量, 特征维度),你直接传入了两个一维的单列数组,不符合接口输入要求,因此触发维度报错。
除此之外你的原有逻辑也存在偏差:需求是计算所有样本点到y_train取值为0的参考点的单点距离,不是所有样本两两之间的距离,不需要传入两个独立的特征列做全量两两计算。
正确实现方法
你可以选以下任意一种方案实现:
- 方案1:使用
pairwise_distances的正确传参写法
from sklearn.metrics import pairwise_distances # 提取参考点:取y_train=0对应行的feat1、feat2坐标,转为符合接口要求的2D数组 ref_point = df_centroid.loc[df_centroid['y_train'] == 0, ['feat1', 'feat2']].values.reshape(1, -1) # 提取所有待计算样本的坐标,结构为(总样本数, 2)的2D数组 all_points = df_centroid[['feat1', 'feat2']].values # 计算所有点到参考点的距离,展平为一维数组后赋值给新列 df_centroid['distance from Class 0'] = pairwise_distances(all_points, ref_point).flatten()
- 方案2:直接按欧氏距离公式计算,无需依赖sklearn,更轻量不会出现维度报错
# 先拿到参考点的x、y坐标 ref_feat1, ref_feat2 = df_centroid.loc[df_centroid['y_train'] == 0, ['feat1', 'feat2']].iloc[0] # 按二维欧氏距离公式逐行计算:距离 = 根号下( (x坐标差)^2 + (y坐标差)^2 ) df_centroid['distance from Class 0'] = ( (df_centroid['feat1'] - ref_feat1) ** 2 + (df_centroid['feat2'] - ref_feat2) ** 2 ) ** 0.5
注意:如果你的数据集里y_train=0对应多条样本,可以先计算类0所有样本的feat1、feat2均值作为类中心参考点,替换上述代码中的参考点取值即可。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

