首页 > 解决方案 > 熊猫将第二个最小值分配给列

问题描述

一直坚持熊猫。我有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

如何在中创建列date2df2其中包含相应电子邮件的第二个最小日期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

标签: pythonpandas

解决方案


您可以使用在 eachsort_values中进行排序,这可以使用要排序的列列表来完成。datesemail

然后你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

推荐阅读