首页 > 解决方案 > 在 pandas 中查找组中第二个最早的时间

问题描述

大熊猫有没有办法在一个组中找到第二个最早的时间?在此数据框中,我想找到买家在特定分店的第二次最早时间,并将分店列保留在 groupby 买家之后(以供将来计数)。

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() 到第二个最早的位置,但如果买家只访问过一个分支,这将包括最早的一些。而且我还想将分支列保留在输出表中。

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

标签: pythonpandasdataframedatetimegroup-by

解决方案


您可以在此处使用 pandasrank功能。

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

这已将排名附加到特定Buyer 和 Branch的每个“日期”值。现在您可以选择所需的等级。

因此,对于买家和 Branch 来说,最早的 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

推荐阅读