Pandas Groupby: условный оператор Groupby

#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")