Pandas groupby: как использовать сдвинутые значения

У меня есть набор данных, который представляет повторяющиеся события в разных местах.

df = [Datetime location time event]

В каждом месте может повторяться 8-10 событий. Я пытаюсь создать некоторую информацию о том, сколько времени прошло между двумя событиями. (это может быть не одно и то же событие)

Я могу это сделать, разбивая df на sub-dfs и обрабатывая каждое местоположение отдельно. Но казалось бы, что группа должна быть умнее этого. Это также предполагает, что я знаю все местоположения, которые могут варьироваться от файла к файлу.

df1 = df[(df['location'] == "Loc A")] 
 df1['delta'] = df1['time'] - df1['time'].shift(1) 

 df2 = df[(df['location'] == "Loc B")] 
 df2['delta'] = df2['time'] - df2['time'].shift(1) 
 ...

...

То, что я хотел бы сделать, это groupBy на основе местоположения...

dfg = df.groupby(['location'])

Затем для каждого сгруппированного местоположения Добавить дельта-столбец Сдвиг и вычитание для получения дельта-времени между событиями

Вопросов: Поддерживает ли группа порядок событий? Будет ли цикл for, который работает над DF, лучше? Это не похоже на python. Также, если у вас есть сгруппированный df, есть способ преобразовать его обратно в общий фреймворк данных. Я не думаю, что мне нужно это сделать, но подумал, что это может быть полезно в будущем.

Благодарим вас за любую поддержку, которую вы можете предложить.

2 ответа

http://pandas.pydata.org/pandas-docs/dev/groupby.html похоже, что он обеспечивает то, что вам нужно.

groups = df.groupby('location').groups

или

for name, group in df.groupby('location')
 // do stuff here

Разделит его на группы строк с соответствующими значениями в столбце местоположения.

Затем вы можете отсортировать группы на основе значения времени и выполнить итерацию для создания дельт.


Похоже, что когда вы группируете и идентифицируете столбец для работы с данными, возвращается в серию, к которой затем можно применить функцию.

deltaTime = lambda x: (x - x.shift(1)) 
df['delta'] = df.groupby('location')['time'].apply(deltaTime)

Это группирует по местоположению и возвращает столбец времени для каждой группы. Затем каждый подсерий передается функции deltaTime.

licensed under cc by-sa 3.0 with attribution.