大熊猫中是否有办法找到第二个最早的时间?在此数据框中,我想找到购买者在特定分支机构进行的第二次尝试,并将分支列保留在分组购买者之后(以供将来计算)。
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相同的格式?谢谢!
答案 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