#pandas #group-by #pandas-groupby #latitude-longitude
#pandas #сгруппировать по #pandas-groupby #широта-долгота
Вопрос:
Я пытаюсь определить местоположение остановок по данным gps, но мне нужно учитывать некоторый дрейф gps.
Я определил остановки и выделил их в новый фрейм данных:
df['Stopped'] = (df.groupby('DAY')['LAT'].diff().abs() <= 0.0005) amp; (df.groupby('DAY')['LNG'].diff().abs() <= 0.0005)
df2 = df.loc[(df['Stopped'] == True)]
Теперь я могу помечать группы, которые имеют точное совпадение в координатах, используя:
df2['StoppedEvent'] = df2.groupby(['LAT','LNG']).ngroup()
Но я хочу сгруппировать по тем же условиям, что и Stopped. Что-то вроде этого, но это работает:
df2['StoppedEvent'] = df2.groupby((['LAT','LNG']).diff().fillna(0).abs() <= 0.0005).ngroup()
Ответ №1:
Я бы сделал что-то вроде следующего:
df['Stopped'] = (df.groupby('DAY')['LAT'].diff().abs() <= 0.0005)
amp; (df.groupby('DAY')['LNG'].diff().abs() <= 0.0005)
df["Stopped_Group"] = (~df["Stopped"]).cumsum()
df2 = df.loc[df['Stopped']]
Теперь у вас будет столбец "Stopped_Group"
, который является постоянным в наборе строк, расположенных близко друг к другу, как определено вашей логикой. В исходном фрейме данных df
этот столбец не будет иметь никакого значения для строк, соответствующих движению.
Чтобы получить желаемый результат (если я вас правильно понимаю), сделайте что-то вроде следующего:
df2["Stopped_Duration"] = df2.groupby("Stopped_Group").transform("size")