Получить 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-ю строку в отсортированных данных