Python 为列指定第二个最小值

Python 为列指定第二个最小值,python,pandas,Python,Pandas,我一直和熊猫在一起。 我有df,它包含每个事务(第一列-索引,按时间排序): 我还有df2,其中包含唯一的电子邮件和最小日期(df1,带有重复的删除项,因为它是按时间排序的,我默认得到最小日期): 如何在df2中创建列date2,其中包含df1中相应电子邮件的第二个最小日期 我尝试了循环: for email in df2['email']: df2.at[email, 'date2'] = df1.loc[df1['email'] == email]['date'].iloc[1]

我一直和熊猫在一起。 我有
df
,它包含每个事务(第一列-索引,按时间排序):

我还有
df2
,其中包含唯一的电子邮件和最小日期(
df1
,带有重复的删除项,因为它是按时间排序的,我默认得到最小日期):

如何在
df2
中创建列
date2
,其中包含
df1
中相应电子邮件的第二个最小日期

我尝试了
循环:

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行和32GB内存-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
您可以使用对每个
电子邮件中的
日期进行排序,这可以使用要排序的列列表来完成

然后您可以通过电子邮件
GroupBy
选择每个组的第二个元素

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
左合并:

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

为什么
date2
列的第一个值是
None
?因为只有一个
aaa
事务,没有第二个。所以,基本上,我想要一个包含三列的表-
email
一个事务的日期
两个事务的日期
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.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