被熊猫困住了。
我有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
,其中包含唯一的电子邮件和最小日期(带有drop_duplicates的df1
,因为它是按时间排序的,因此默认情况下,我会得到最小日期):
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
但是它非常长(5.5万行和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
答案 0 :(得分:1)
您可以使用sort_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
上的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