#python #pandas #dataframe #pandas-groupby
#python #pandas #фрейм данных #pandas-groupby
Вопрос:
У меня есть этот фрейм данных :
id start end
1 1 2
1 13 27
1 30 35
1 36 40
2 2 5
2 8 10
2 25 30
Я хочу сгруппировать по идентификатору и агрегировать строки, где разница end
в n-1 строке и start
n строке меньше 10, например. Я уже нашел способ использовать цикл, но он слишком длинный, с более чем миллионом строк.
Таким образом, ожидаемый результат будет :
id start end
1 1 2
1 13 40
2 2 10
2 25 30
Сначала я могу получить требуемую разницу, используя df['diff']=df['start'].shift(-1)-df['end']
. Как я могу собирать идентификаторы на основе условия для каждого отдельного идентификатора?
Спасибо!
Ответ №1:
Я считаю, что вы можете создавать группы, используя suntract, сдвинутые end
на DataFrameGroupBy.shift
с большей аналогичной 10
и кумулятивной суммой, и переходить к GroupBy.agg
:
g = df['start'].sub(df.groupby('id')['end'].shift()).gt(10).cumsum()
df = (df.groupby(['id',g])
.agg({'start':'first', 'end': 'last'})
.reset_index(level=1, drop=True)
.reset_index())
print (df)
id start end
0 1 1 2
1 1 13 40
2 2 2 10
3 2 25 30
Комментарии:
1. Он отлично работает! Спасибо! Случайно, вы не знаете, где я могу найти некоторые документы, объясняющие основные функции с примерами pandas, таких как agg, groupby и т. Д.?
2. @Pi-R — я думаю, вы можете проверить учебные пособия