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

如何在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列存在重复值,需要完成两个操作:

  1. 每个ID统一使用一个指定的score值
  2. 每个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:07:38