【发布时间】:2019-09-06 13:14:12
【问题描述】:
我有一个看起来像这样的熊猫数据框:
In [5]: import pandas as pd
In [6]: df = pd.DataFrame({'X': [0, 123, 342, 353, 467, 345, 789, 543, 3913],
...: 'Y': [0, 12, 23, 41, 23, 45, 23, 53, 23],
...: 'Group': [0, 1, 2, 0, 1, 2, 0, 1, 2]})
In [7]: df
Out[7]:
X Y Group
0 0 0 0
1 123 12 1
2 342 23 2
3 353 41 0
4 467 23 1
5 345 45 2
6 789 23 0
7 543 53 1
8 3913 23 2
这三组代表测量系列,我想为系列的每次测量计算到前一个元素的欧几里得距离,并将每次测量加起来。 (第一次测量距离 = 0)。
我已阅读此处有关如何将 groupby 操作的结果重新分配回父数据框的所有论坛主题。但是在我基于组为数据框的每个条目(非聚合)计算一些东西的情况下,我找不到任何解决方案。
所以我想知道如何结合这些步骤:
from scipy.spatial.distance import euclidean
# 1. Group data
group = df.groupby('Group')
# 2. Calculate cumulative euclidean distance for each group
group['Distance'] = group.apply(lambda row: euclidean(row['X'], row['Y']).cumsum(), axis=1)
# 3. Assign back to original dataframe
第 1 步非常简单。对于第 2 步,我尝试了很多 df.groupby.apply 和 df.groupby.apply.transform 的组合以及定义我自己的函数(不知道这是否适合单行)。但我无法真正让它按照我想要的方式行事。我假设groupby().transform() 是我想要的,但我无法让它按行操作。
还为了将结果重新分配给我的原始数据框而不是仅分配给 groupby 对象,我尝试了df.join、pd.merge、pd.concat 等等,但我现在非常困惑什么区别是:D。
我想要的输出是:
Out[7]:
X Y Group Distance Cumulative Distance
0 0 0 0 0 0
1 123 12 1 0 0
2 342 23 2 0 0
3 353 41 0 355.37 355.37
4 467 23 1 344.17 344.17
5 345 45 2 22.20 22.20
6 789 23 0 436.37 791.74
7 543 53 1 81.71 425.88
8 3913 23 2 3568.07 3590.44
我只需要累积距离(再次按组计算)。但我将个人距离列为中间步骤。
【问题讨论】:
-
为什么在 idx 1 和 2
0处会出现“距离”? -
@ChrisA 他们是小组的起点。在组内计算距离。
-
我认为您的预期结果是错误的。您假设使用
euclidean(point1, point2)euclidean([467, 23], [123, 12])应该产生 344.17 而不是 457.66 -
对不起,我在跑,想在离开前把问题推开,所以我在 excel 中快速完成了距离。我会适应的。 @ChrisA是的,我想按组计算到前一个条目的距离。所以对于每个组中的第一个条目,它应该是 0。
-
请将您的预期结果与我的回答进行比较。
标签: python pandas function merge pandas-groupby