Найти второе самое раннее время в группе в пандах - PullRequest
0 голосов
/ 11 октября 2018

Есть ли в пандах способ найти второе самое раннее время в группе?В этом фрейме данных я хочу найти второй самый ранний раз, когда покупатель совершает покупку в определенной ветви, и сохранить столбец ветви после групповых покупателей (для целей будущего подсчета).

import pandas as pd
import numpy as np
import datetime
df = pd.DataFrame({'Branch' : 'A A A A A A A B B C'.split(),
'Buyer': 'Carl Mark Carl Carl Joe Joe Joe Carl Mark Joe'.split(),
'Date':[datetime.datetime(2013,1,1,13,0),datetime.datetime(2013,1,1,13,5),datetime.datetime(2013,10,1,20,0),datetime.datetime(2013,10,2,10,0),datetime.datetime(2013,10,1,20,0),datetime.datetime(2013,10,2,10,0),datetime.datetime(2013,12,2,12,0),datetime.datetime(2013,12,2,14,0), datetime.datetime(2013,11,2,14,0), datetime.datetime(2013,11,5,14,0)]})

Я мог бы найти самое раннее времядля каждого покупателя в определенном филиале, как показано ниже:

df.groupby('Buyer').agg({'Date':'min', 'Branch':'first'})

У меня проблемы с поиском второго самого раннего.Я пытался использовать nsmallest (2) и last () для второго самого раннего, но это включало бы некоторые из самых ранних, если покупатель посетил только один филиал.И я также хотел бы сохранить столбец ветвления в выходной таблице.

Как я могу найти второе самое раннее время, сохраняя тот же формат, что и для группы, которую я делал выше?Спасибо!

1 Ответ

0 голосов
/ 11 октября 2018

Здесь вы можете использовать функцию панд rank.

In [23]: df
Out[23]: 
  Branch Buyer                Date
0      A  Carl 2013-01-01 13:00:00
1      A  Mark 2013-01-01 13:05:00
2      A  Carl 2013-10-01 20:00:00
3      A  Carl 2013-10-02 10:00:00
4      A   Joe 2013-10-01 20:00:00
5      A   Joe 2013-10-02 10:00:00
6      A   Joe 2013-12-02 12:00:00
7      B  Carl 2013-12-02 14:00:00
8      B  Mark 2013-11-02 14:00:00
9      C   Joe 2013-11-05 14:00:00

df['rank'] = df.groupby(['Buyer','Branch'])['Date'].rank(ascending=True)

print(df)
Out[31]: 
  Branch Buyer                Date  rank
0      A  Carl 2013-01-01 13:00:00   1.0
1      A  Mark 2013-01-01 13:05:00   1.0
2      A  Carl 2013-10-01 20:00:00   2.0
3      A  Carl 2013-10-02 10:00:00   3.0
4      A   Joe 2013-10-01 20:00:00   1.0
5      A   Joe 2013-10-02 10:00:00   2.0
6      A   Joe 2013-12-02 12:00:00   3.0
7      B  Carl 2013-12-02 14:00:00   1.0
8      B  Mark 2013-11-02 14:00:00   1.0
9      C   Joe 2013-11-05 14:00:00   1.0

Это присвоило ранг каждому значению «Дата» для определенного Покупатель и филиал .Теперь вы можете выбрать желаемый ранг, который хотите.

Итак, 2-й по рангу для покупателя и филиала будет примерно таким: df.query('rank == 2.0')

Out[39]: 
  Branch Buyer                Date  rank
2      A  Carl 2013-10-01 20:00:00   2.0
5      A   Joe 2013-10-02 10:00:00   2.0
...