在大Pandas群体中发现第二早的时间

2024-05-05 11:22:23 发布

您现在位置:Python中文网/ 问答频道 /正文

大熊猫有没有办法在一个群体中找到第二早的时间?在这个数据框架中,我希望找到买家在特定分支机构的第二个最早时间,并在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相同的格式?谢谢大家!


Tags: importbranchdfdatetimeas时间buyerpd
1条回答
网友
1楼 · 发布于 2024-05-05 11:22:23

您可以在这里使用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

这将为特定买家和分支机构的每个“日期”值附加排名。现在你可以选择你想要的等级

因此,对于买方和分支机构来说,第二早是这样的: 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

相关问题 更多 >