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

Python/Pandas如何筛选Name与Date组合唯一的行并获取索引?

问题描述

我有一个如下结构的Pandas DataFrame:

Date RegisteredNameGift
2021-10-30John DoeMoney
2021-10-30John DoeFood
2021-11-02Tyler BlueGift Card
2021-11-02Tyler BlueFood
2021-12-01John DoeSupplies

我需要定位所有满足**"Name列值重复但对应Date Registered列值唯一"**的行(或它们的索引),最终目标结果如下:

Date RegisteredNameGift
2021-10-30John DoeMoney
2021-11-02Tyler BlueGift Card
2021-12-01John DoeSupplies

我尝试了以下代码,但无法实现需求:

name_view = df.drop_duplicates(subset=['Name', 'DateTime'], keep= 'last')
def extract_name(TableName):
    return TableName.duplicated(subset=['Name']) 
extract_name(name_view)
解决方案

你的核心需求是:对每个Name,保留每个唯一Date Registered对应的一行(可选择保留同组内的首行或末行)。以下是两种可行实现方式:

方法1:直接去重(推荐)

使用drop_duplicates指定子集为['Name', 'Date Registered'],设置keep参数选择保留同组内的首行或末行:

# 保留每个(Name, Date Registered)组合的第一行,得到目标DataFrame
result_df = df.drop_duplicates(subset=['Name', 'Date Registered'], keep='first')
# 获取对应原DataFrame的索引列表
result_indexes = result_df.index.tolist()

如果想保留同组内的最后一行,只需把keep='first'改成keep='last'即可。

方法2:分组提取

通过groupby按Name和Date Registered分组,提取每组的首行(或末行):

# 分组后取每组第一行,重置索引恢复原结构
result_df = df.groupby(['Name', 'Date Registered']).first().reset_index()
# 获取原DataFrame中的对应索引
result_indexes = df.groupby(['Name', 'Date Registered']).apply(lambda x: x.index[0]).tolist()

原代码问题分析

  1. 存在拼写错误:代码里的DateTime应为Date Registered;
  2. 逻辑偏离需求:原代码先去重后检测Name重复,这和你要保留每个(Name, Date)组合一行的目标完全不符,自然无法得到正确结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:55:20