我正在尝试从头开始编写一个 k 均值算法。假设我有以下数据框...
df =
a b c
0 1 4 [1, 2]
1 2 5 [1, 2]
2 3 6 [1, 2]
...其中
c
表示质心的坐标,我想计算点 (a, b) 和质心 (1, 2) 之间的逐行欧几里德距离。我想将列 c
替换为每行的点到质心距离。
我有以下代码:
df['c'].apply(lambda x: ((x[0]-df['a'])**2 + (x[1]-df['b'])**2)**0.5)
我希望它返回一个长度为 len(df) 的一维向量(Series):
0 2.000000
1 3.162278
2 4.472136
dtype: float64
但它返回一个数据框:
0 1 2
0 2.0 3.162278 4.472136
1 2.0 3.162278 4.472136
2 2.0 3.162278 4.472136
造成这种行为的原因是什么?我如何完成我想做的事情?
df['a']
和 df['b']
是 Series,因此结果是 Series,因此 Series.apply
会生成 DataFrame。 (根据 docs:“如果 func 返回 Series 对象,则结果将是 DataFrame。”)
您甚至不需要在这里使用
.apply
。
df['c'] = (df['c'] - df['a'])**2 + (df['c'] - df['b'])**2) ** 0.5