You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame中应用自定义成对距离函数?解决pdist索引错误

解决Pandas DataFrame自定义成对距离函数与scipy pdist/sklearn兼容性问题

你遇到的问题很典型:scipy的pdist和sklearn的pairwise_distances会自动把输入的DataFrame转换成numpy ndarray,所以你的自定义函数拿到的是数组而非DataFrame行对象,自然没法用列名(比如f1['A'])索引,这就是IndexError的原因。下面给你几种可行的解决方案:

方案1:修改自定义函数适配ndarray

如果你的距离逻辑可以通过列的位置来实现,这是最简单的方法。比如你的例子中'A'是DataFrame的第一列(索引为0),直接修改函数用数组索引即可:

import pandas as pd
from scipy.spatial.distance import pdist

df = pd.DataFrame([[1,2,3,3],[2,3,3,4],[4,1,3,2]],columns=['A','B','C','D'])

def myDistance(arr1, arr2):
    # 用数组索引代替列名,arr1[0]对应原行的'A'列
    return arr1[0] - arr2[0]

dist = pdist(df, myDistance)
print(dist)  # 输出: array([-1., -3., -2.])

这个结果对应行对(0,1)、(0,2)、(1,2)的距离,和你手动调用myDistance(df.loc[0],df.loc[1])的逻辑一致。

方案2:手动生成行对,保留DataFrame行对象

如果你的自定义距离逻辑很复杂,必须依赖DataFrame行的列名操作,可以用itertools.combinations手动生成所有不重复的行对,直接传入行对象计算:

import pandas as pd
from itertools import combinations

df = pd.DataFrame([[1,2,3,3],[2,3,3,4],[4,1,3,2]],columns=['A','B','C','D'])

def myDistance(f1,f2):
    return f1['A'] - f2['A']

# 生成所有行索引的组合(不重复的成对)
row_pairs = combinations(df.index, 2)
# 遍历组合计算距离
distances = [myDistance(df.loc[i], df.loc[j]) for i, j in row_pairs]

print(distances)  # 输出: [-1, -3, -2]

这种方式完全保留了DataFrame行的结构,你可以在myDistance里自由使用列名、甚至行的其他属性,灵活性最高。

方案3:用sklearn pairwise_distances并转换回Series

如果你需要得到完整的距离矩阵(而非pdist的压缩结果),可以用sklearn的pairwise_distances,在自定义函数里把ndarray转回Series:

import pandas as pd
from sklearn.metrics.pairwise import pairwise_distances

df = pd.DataFrame([[1,2,3,3],[2,3,3,4],[4,1,3,2]],columns=['A','B','C','D'])

def myDistance(arr1, arr2):
    # 把数组转回Series,指定原DataFrame的列名
    f1 = pd.Series(arr1, index=df.columns)
    f2 = pd.Series(arr2, index=df.columns)
    return f1['A'] - f2['A']

# 生成对称距离矩阵
dist_matrix = pairwise_distances(df, metric=myDistance)
print(dist_matrix)
# 输出:
# [[ 0. -1. -3.]
#  [ 1.  0. -2.]
#  [ 3.  2.  0.]]

注意这里的矩阵是对称的,dist_matrix[i][j]表示行i到行j的距离,和pdist的压缩结果对应。

内容的提问来源于stack exchange,提问作者matlabit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:21:28