我有一个这样的数据框
import pandas as pd
sample = pd.DataFrame({'Col1': ['1','0','1','0'],'Col2':['0','0','1','1'],'Col3':['0','0','1','0'],'Class':['A','B','A','B']},index=['Item1','Item2','Item3','Item4'])
In [32]: print(sample)
Out [32]:
Col1 Col2 Col3 Class
Item1 1 0 0 A
Item2 0 0 0 B
Item3 1 1 1 A
Item4 0 1 0 B
我想计算differents类的行之间的行距离。我的意思是,首先我要计算classA行之间的距离
Item1 Item3
Item1 0 0.67
Item3 0.67 0
其次,B类行之间的距离
Item2 Item4
Item2 0 1
Item4 1 0
最后是不同阶级之间的距离。
Item2 Item4
Item1 1 1
Item3 1 0.67
我尝试用DistanceMetric一对一地计算距离
from sklearn.neighbors import DistanceMetric
dist = DistanceMetric.get_metric('jacquard')
但是我不知道我是否可以对大型数据框中的不同行进行迭代,并创建具有距离的3个不同矩阵
要查找A类和B类内的距离,可以使用DataFrame.groupby
,(使用的距离为euclidean
):
def find_distance(group):
return pd.DataFrame(dist.pairwise(group.values))
df.groupby('Class').apply(find_distance)
0 1
Class
A 0 0.000000 1.414214
1 1.414214 0.000000
B 0 0.000000 1.000000
1 1.000000 0.000000
如果只有两个类,则可以将两个类分为两个数据帧,然后计算差值:
dist_cols = ['Col1', 'Col2','Col3']
df_a = df[df['Class']=='A']
df_b = df[df['Class']=='B']
distances = dist.pairwise(df_a[dist_cols].values, df_b[dist_cols].values)
distances
> array([[1. , 1.41421356],
[1.73205081, 1.41421356]])
pd.DataFrame(distances, columns = df_b.index, index = df_a.index)
Item2 Item4
Item1 1.000000 1.414214
Item3 1.732051 1.414214
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句