Я знаю, что это расширение вопроса, но это то, что мне часто нужно, а иногда и забывают, поэтому я делюсь здесь:
Скажем, вместо того, чтобы просто хотеть второе самое последнее или второе самое раннее свиданиедля всего фрейма данных у вас есть фрейм данных о пользователях и датах, и вы хотите получить вторую самую раннюю дату для каждого пользователя (например, его вторую транзакцию).
Пример кадра данных:
test = pd.DataFrame()
test['users'] = [1,2,3,2,3,2]
test['dates'] = pd.to_datetime(['2019-01-01','2019-01-01',
'2019-01-02','2019-01-02',
'2019-01-03','2019-01-04'])
Самая ранняя дата для пользователя 2 - «2019-01-01», а вторая самая ранняя дата - «20 -19-01-02».Мы можем использовать groupby, apply и nlargest / nsmallest:
test.groupby('users')['dates'].apply(lambda x: x.nsmallest(2).max())
, что дает нам такой вывод:
users
1 2019-01-01
2 2019-01-02
3 2019-01-03
Name: dates, dtype: datetime64[ns]