У меня есть кадр данных pandas, который выглядит следующим образом:
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 довольно прост.На втором этапе я попробовал множество комбинаций 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
Мне нужно только суммарное расстояние (снова вычисляется для группы).Но я перечислил индивидуальное расстояние как промежуточный шаг.