如何在Pandas DataFrame中为每个ID保留最早的两个日期
解决方法:为每个ID保留最早的两个日期
没问题,咱们可以用Pandas的分组、排序和筛选组合操作来实现这个需求,而且得先处理日期格式的问题,不然字符串排序会出错哦。我来一步步给你演示:
步骤分解
- 转换日期列类型:原数据里的
start_date是字符串格式,直接排序会按字符顺序来(比如01/05/2010字符串排序会比08/08/2009靠前,但实际2009年的日期更早),所以首先要把它转换成datetime类型。 - 分组排序:按
id分组,然后对每个组内的日期进行升序排序(让最早的日期排在前面)。 - 筛选前N行:对每个分组保留前2行数据,如果某个ID只有1条记录(比如示例里的id=3),就自动保留这条记录。
完整代码实现
import pandas as pd # 初始化原DataFrame df = pd.DataFrame( [['1','01/01/2000'], ['1','01/07/2002'],['1', '04/05/2003'], ['2','01/05/2010'], ['2','08/08/2009'], ['3','12/11/2008']], columns=['id','start_date'] ) # 1. 转换日期列格式,指定格式避免解析错误 df['start_date'] = pd.to_datetime(df['start_date'], format='%m/%d/%Y') # 2. 分组+排序+取前2行,最后重置索引 result_df = df.sort_values(['id', 'start_date']) \ .groupby('id').head(2) \ .reset_index(drop=True) # 把日期转回原字符串格式(如果需要的话) result_df['start_date'] = result_df['start_date'].dt.strftime('%m/%d/%Y') print(result_df)
输出结果
id start_date 0 1 01/01/2000 1 1 01/07/2002 2 2 08/08/2009 3 2 01/05/2010 4 3 12/11/2008
补充说明
- 如果不需要把日期转回字符串格式,可以去掉最后一步
dt.strftime的操作,保留datetime类型更方便后续处理。 groupby('id').head(2)会自动处理分组内数据不足2行的情况,直接保留所有行,非常灵活。
内容的提问来源于stack exchange,提问作者gtomer
相关产品推荐
相关产品推荐

