如何在Python Pandas中按ID去除DataFrame某列的重复值?
Pandas实现按ID统一保留单一Score值并去重
原始数据
import pandas as pd data = {'id': [1, 1, 1, 1, 2, 2, 3, 3], 'nps': [8, 8, 8, 8, 7, 7, 9, 9], 'target': [True, True, True, True, False, False, True, True], 'score': [0.56, 0.78, 0.56, 0.78, 0.6785, 0.42, 0.9, 0.63], 'day': ['2023-02-15', '2023-02-15', '2023-02-22', '2023-02-22', '2023-06-10', '2023-06-10', '2023-07-01', '2023-07-01']} df = pd.DataFrame(data)
需求说明
每个ID对应的score列存在重复值,需要完成两个操作:
- 每个ID统一使用一个指定的
score值 - 每个ID+日期(
day)组合仅保留一行记录
实现步骤
方法1:自定义ID-Score映射
如果已经明确每个ID要保留的Score值,直接创建映射字典替换后去重:
# 定义每个ID对应的目标Score值 score_map = {1: 0.56, 2: 0.42, 3: 0.9} # 替换原DataFrame的score列 df['score'] = df['id'].map(score_map) # 按id和day去重,保留唯一记录 result = df.drop_duplicates(subset=['id', 'day']).reset_index(drop=True) print(result)
方法2:按规则自动选择Score
如果需要根据业务规则(如众数、最小值、最大值)自动选择每个ID的Score,可通过分组实现:
# 定义每个ID的Score选择规则 def select_target_score(series): # 可根据实际需求修改规则 if series.name == 1: return 0.56 # 自定义指定值 elif series.name == 2: return series.min() # 选择最小值 elif series.name == 3: return series.max() # 选择最大值 # 默认返回出现次数最多的众数 return series.mode().iloc[0] # 生成ID到Score的映射关系 score_map = df.groupby('id')['score'].apply(select_target_score).to_dict() # 替换Score并去重 df['score'] = df['id'].map(score_map) result = df.drop_duplicates(subset=['id', 'day']).reset_index(drop=True) print(result)
最终输出
id nps target score day 0 1 8 True 0.56 2023-02-15 1 1 8 True 0.56 2023-02-22 2 2 7 False 0.42 2023-06-10 3 3 9 True 0.90 2023-07-01
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

