我在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 |
---------------------------------
总而言之,我想按电子邮件分组,获取最新的日期并保留状态列
答案 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