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