You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame中为每个ID保留最早的两个日期

解决方法:为每个ID保留最早的两个日期

没问题,咱们可以用Pandas的分组、排序和筛选组合操作来实现这个需求,而且得先处理日期格式的问题,不然字符串排序会出错哦。我来一步步给你演示:

步骤分解

  1. 转换日期列类型:原数据里的start_date是字符串格式,直接排序会按字符顺序来(比如01/05/2010字符串排序会比08/08/2009靠前,但实际2009年的日期更早),所以首先要把它转换成datetime类型。
  2. 分组排序:按id分组,然后对每个组内的日期进行升序排序(让最早的日期排在前面)。
  3. 筛选前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 11:08:13