在熊猫群中找到第二最早的时间

时间:2018-10-11 03:37:48

标签: pandas datetime group-by aggregate

大熊猫中是否有办法找到第二个最早的时间?在此数据框中,我想找到购买者在特定分支机构进行的第二次尝试,并将分支列保留在分组购买者之后(以供将来计算)。

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()最早用于第二个,但是如果买方只访问了一个分支,那将包括最早的一些。而且我也想将branch列保留在输出表中。

我怎么能找到第二个最早的时间保持与我上面的groupby相同的格式?谢谢!

1 个答案:

答案 0 :(得分:0)

您可以在此处使用熊猫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

这已将排名附加到特定买方和分支机构的每个“日期”值。现在,您可以选择所需的排名。

因此,第二个最早的买家和Branch会是这样的: 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