熊猫为列分配第二个最小值

时间:2018-12-27 08:50:53

标签: python pandas

被熊猫困住了。 我有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

1 个答案:

答案 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