python - 在 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 相同的格式?谢谢!
解决方案
您可以在此处使用 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
推荐阅读
- c# - 使用百分比创建对象动画
- java - 如何将 Maven 项目外部的文件添加到 ZIP 发行版?
- c# - 如何在 .net wpf 应用程序中支持来自精密触摸板的 2 指捏合/缩放手势?
- r - R:来自 e1071 预测的 svm 因“概率”参数设置而异
- python - Pandas:按项目在 DataFrame 中出现的次数过滤列
- python - 如何在不抓取文档本身的情况下从网页获取文件的下载链接?
- python-2.7 - 用于在树莓派上自动更改 crontab 启动的 Python 脚本
- apache-kafka - java.lang.IllegalArgumentException,同时将 SASL_PLAINTEXT 身份验证添加到 kafka 代理
- linux - 当从 hdi 工作节点运行时,hdfs 是否知道 umi 安全上下文?
- python - 我不断收到我的列表索引超出范围的错误