Python/Pandas如何筛选Name与Date组合唯一的行并获取索引?
问题描述
我有一个如下结构的Pandas DataFrame:
| Date Registered | Name | Gift |
|---|---|---|
| 2021-10-30 | John Doe | Money |
| 2021-10-30 | John Doe | Food |
| 2021-11-02 | Tyler Blue | Gift Card |
| 2021-11-02 | Tyler Blue | Food |
| 2021-12-01 | John Doe | Supplies |
我需要定位所有满足**"Name列值重复但对应Date Registered列值唯一"**的行(或它们的索引),最终目标结果如下:
| Date Registered | Name | Gift |
|---|---|---|
| 2021-10-30 | John Doe | Money |
| 2021-11-02 | Tyler Blue | Gift Card |
| 2021-12-01 | John Doe | Supplies |
我尝试了以下代码,但无法实现需求:
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()
原代码问题分析
- 存在拼写错误:代码里的
DateTime应为Date Registered; - 逻辑偏离需求:原代码先去重后检测
Name重复,这和你要保留每个(Name, Date)组合一行的目标完全不符,自然无法得到正确结果。
内容的提问来源于stack exchange,提问作者thorscode
相关产品推荐
相关产品推荐

