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

Python处理DataFrame:按id和code保留最早code_date的行

问题描述

现有如下DataFrame:

id code code_date   medication medication_date
1  A     2017-05-18 Y          2017-05-18
1  A     2017-05-25 V          2017-05-18
1  Y     2017-07-18 D          2017-05-18
2  C     2017-08-18 C          2017-05-18
2  C     2017-09-18 Y          2017-05-18
2  Y     2017-03-18 O          2017-05-18

需求:筛选出每个id下各code对应最早code_date的行,移除同一id和code组合中日期较晚的重复行,同时保留medication和medication_date列,期望结果如下:

id code code_date   medication medication_date
1  A     2017-05-18 Y          2017-05-18
1  Y     2017-07-18 D          2017-05-18
2  C     2017-08-18 C          2017-05-18
2  Y     2017-03-18 O          2017-05-18

尝试过以下代码,但未得到正确结果:

df.groupby(["id", "code", "code_date"]).nth(0).reset_index()
解决方案

你之前的代码错误在于把code_date也加入了分组,这会导致同一id+code下不同的code_date被当成独立分组,无法筛选出该组合下最早的日期行。以下是两种可行的解决方法:

方法一:排序后保留每组首行

先将code_date转为日期类型(确保排序逻辑正确),再按id、code分组,对code_date升序排序后保留每组第一行:

import pandas as pd

# 转换日期类型(若未转换)
df['code_date'] = pd.to_datetime(df['code_date'])

# 排序后取每组首行
result = df.sort_values(['id', 'code', 'code_date']).groupby(['id', 'code']).first().reset_index()

方法二:筛选每组最小日期的行

先计算每个id+code对应的最小code_date,再通过合并匹配原数据中的对应行:

import pandas as pd

# 转换日期类型(若未转换)
df['code_date'] = pd.to_datetime(df['code_date'])

# 计算每组的最小日期
min_dates = df.groupby(['id', 'code'])['code_date'].min().reset_index()

# 匹配筛选目标行
result = pd.merge(df, min_dates, on=['id', 'code', 'code_date'])

两种方法均可得到你期望的结果,输出如下:

id code code_date   medication medication_date
1  A    2017-05-18 Y          2017-05-18
1  Y    2017-07-18 D          2017-05-18
2  C    2017-08-18 C          2017-05-18
2  Y    2017-03-18 O          2017-05-18

内容的提问来源于stack exchange,提问作者Economist_Ayahuasca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:45:37