如何在熊猫中不按groupedBy保留分组列

时间:2018-07-23 14:42:20

标签: python pandas dataframe

我在pandas中有一个数据框,我想按电子邮件分组,获取 date 的最大值并保持状态列。但是groupby上未使用状态

示例:给出以下数据框df

+-------------------------------+
|  email  |  status  |   date   |
+-------------------------------+
|  test1  |  viewed  | 01/07/18 |
---------------------------------
|  test1  |not viewed| 03/07/18 | 
---------------------------------
|  test2  |not viewed| 02/07/18 |
---------------------------------
|  test2  |  viewed  | 01/07/18 | 
---------------------------------
|  test3  |not viewed| 03/07/18 |
---------------------------------
|  test3  |  viewed  | 04/07/18 |
---------------------------------

我使用以下代码,但是我想保留状态列,但是我不知道如何。

df.groupby([email]).aggregate({'date': max})

所需的输出:

+-------------------------------+
|  email  |  status  |   date   |
+-------------------------------+    
|  test1  |not viewed| 03/07/18 | 
---------------------------------
|  test2  |not viewed| 02/07/18 | 
---------------------------------
|  test3  |  viewed  | 04/07/18 |
---------------------------------

总而言之,我想按电子邮件分组,获取最新的日期并保留状态

3 个答案:

答案 0 :(得分:3)

您可以按日期而不是agg进行排序,使用groupby并选择最后一个(将是最新的):

df['date'] = pd.to_datetime(df.date)

df.sort_values('date').groupby('email', as_index=False).last()

   email      status       date
0  test1  not viewed 2018-03-07
1  test2  not viewed 2018-02-07
2  test3      viewed 2018-04-07

答案 1 :(得分:2)

您可以使用drop_duplicates

#df['date'] = pd.to_datetime(df.date)

df.sort_values('date').drop_duplicates(['email'],keep='last')

答案 2 :(得分:1)

您可以找到每个组的最大日期索引,然后对原始DataFrame进行子集化。

import pandas as pd
df['date'] = pd.to_datetime(df.date)

df.loc[df.groupby('email').date.idxmax()]

输出:

   email      status       date
1  test1  not viewed 2018-03-07
2  test2  not viewed 2018-02-07
5  test3      viewed 2018-04-07