python - 熊猫将第二个最小值分配给列
问题描述
一直坚持熊猫。我有df
其中包含每笔交易(第一列 - 索引,按时间排序):
email date
43487 aaa 2017-10-11 08:28:39
42910 bbb 2017-09-24 07:49:52
45561 bbb 2017-12-03 11:03:56
47212 bbb 2018-01-02 12:25:52
89734 ccc 2018-02-02 12:25:52
89734 ccc 2018-03-02 12:20:52
我也有df2
其中包含唯一的电子邮件和最小日期(df1
使用 drop_duplicates,因为它是按时间排序的,所以我默认得到最小日期):
email date
43487 aaa 2017-10-11 08:28:39
42910 bbb 2017-09-24 07:49:52
89734 ccc 2018-02-02 12:25:52
如何在中创建列date2
,df2
其中包含相应电子邮件的第二个最小日期df1
?
我试过for
循环:
for email in df2['email']:
df2.at[email, 'date2'] = df1.loc[df1['email'] == email]['date'].iloc[1]
if len(df1.loc[df1['email'] == email]['date']) > 1 else None
但它很长(55k 行和 32 GB RAM - 5 分钟内没有结果)。
期望的输出是:
email date date 2
43487 aaa 2017-10-11 08:28:39 None
42910 bbb 2017-09-24 07:49:52 2017-12-03 11:03:56
89734 ccc 2018-02-02 12:25:52 2018-03-02 12:20:52
解决方案
您可以使用在 eachsort_values
中进行排序,这可以使用要排序的列列表来完成。dates
email
然后你GroupBy
email
和使用nth
来选择每个组的第二个元素。
date2 = df.sort_values(['email','date']).groupby('email').nth(1)
date
email
bbb 2017-12-03 11:03:56
ccc 2018-03-02 12:20:52
df2
最后与on合并email
:
df2.merge(date2, on = 'email', how = 'left')
email date_x date_y
0 aaa 2017-10-11 08:28:39 NaT
1 bbb 2017-09-24 07:49:52 2017-12-03 11:03:56
2 ccc 2018-02-02 12:25:52 2018-03-02 12:20:52
推荐阅读
- python - 在python中排列字符图
- java - Java Firestore Android 在查询中使用数组列表来显示来自关注用户的帖子
- git - 登录失败即使我在 git Bash 中输入了正确的用户名和密码?
- javascript - 如何将变量传递给运行内联 Javascript 的 Rails?
- python - 在迁移学习中,我们可以改变输入大小吗?
- node.js - 每次我想创建一个反应应用程序时都会收到这个错误:
- arduino - 如何连接 Arduino nano 33 IOT 和 PN532 模块?
- python - Python open() 给出“FileNotFoundError: [Errno 2] No such file or directory:”,但文件存在
- python - Pytorch:能不能让一个没有bias的卷积模块再有bias?
- javascript - Tippy.JS“TypeError:instance.setContent 不是函数”