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
相关产品推荐
相关产品推荐

