используйте groupby и пользовательский agg в pandas фрейма данных

#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 — я думаю, вы можете проверить учебные пособия