为什么Series.apply()返回一个数据帧而不是一个系列?

问题描述 投票:0回答:1

我正在尝试从头开始编写一个 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

造成这种行为的原因是什么?我如何完成我想做的事情?

python pandas lambda apply
1个回答
0
投票
lambda 中使用的

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
© www.soinside.com 2019 - 2024. All rights reserved.