Python Pandas:如何在重复数据中按规则选择指定记录
解决方案
步骤说明
- 保留含NaN的记录:原代码的
dropna会丢失仅含NaN Plan的用户(比如JQ),因此不提前删除NaN,后续处理时优先保留有效Plan,无有效Plan则保留NaN。 - 设置Plan优先级:给
College赋予更高优先级,确保同一日期下College排在其他Plan之前。 - 多维度排序去重:先按日期从新到旧排序,再按Plan优先级从高到低排序,最后保留每个用户的第一条记录,即为最新日期下的最优Plan。
修改后代码
# 定义Plan优先级:College > Work > NaN plan_priority = {'College': 2, 'Work': 1, float('nan'): 0} # 按日期降序、Plan优先级降序排序 df_sorted = df.sort_values( by=['Date', df['Plan'].map(plan_priority)], ascending=[False, False] ) # 保留每个Name的第一条最优记录 result = df_sorted.drop_duplicates('Name', keep='first') # 可选:按Name排序整理结果 result = result.sort_values('Name').reset_index(drop=True)
代码解释
plan_priority字典定义权重,让College在同一日期的排序中优先于Work,NaN权重最低。sort_values实现双维度排序:先确保最新日期的记录排在前面,再在同日期内让高优先级Plan靠前。drop_duplicates('Name', keep='first')直接锁定每个用户的最优记录,同时保留了仅含NaN的用户条目。
验证结果
运行后输出与需求完全一致:
| Date | Name | Plan |
|---|---|---|
| 2022 | John | College |
| 2021 | Kel | College |
| 2022 | James | Work |
| 2019 | Daron | College |
| 2019 | JQ | NaN |
| 2021 | Mel | Work |
| 2018 | Shama | Work |
内容的提问来源于stack exchange,提问作者Matthew Rozanoff
相关产品推荐
相关产品推荐

