Получить n-ую строку после применения лямбды к групповому в python

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

но я обнаружил, что после применения лямбды он становится кадром данных, а не группой по объекту, поэтому я не могу использовать свойство.nth

grouped = df.groupby(['SessionId'])

sorted = grouped.apply(lambda x: x.sort_values(["Created"], ascending = True))

sorted.nth  ---> error  

2 ответа

Решение

В этом случае поможет изменение порядка, в котором вы подходите к проблеме. Если вы сначала отсортируете, а затем используете groupby, вы получите желаемый результат и можете использовать функцию groupby.nth.

Вот фрагмент кода для демонстрации идеи:

df = pd.DataFrame({'id':['a','a','a','b','b','b'],
                  'var1':[3,2,1,8,7,6],
                  'var2':['g','h','i','j','k','l']})

n = 2 # replace with required row from each group

df.sort_values(['id','var1']).groupby('id').nth(n).reset_index()

Если предположить, id ваш сессионный и var1 это временная метка, она сортирует ваши данные по id а потом var1, Затем поднимает nй ряд из каждой из этих отсортированных групп. reset_index() это просто, чтобы избежать результирующего мультииндекса.

Если вы хотите получить последний n строки каждой группы, вы можете использовать .tail(n) вместо .nth(n),

Я создал небольшой набор данных -

n = 2
grouped = df.groupby('SessionId')
pd.concat([grouped.get_group(x).sort_values(by='SortVar').reset_index().loc[[n]] for x in grouped.groups]\
          ,axis=0)

Это вернется -

Обратите внимание, что индекс Python начинается с нуля, поэтому при n=2 он даст вам 3-ю строку в отсортированных данных

Другие вопросы по тегам