Pandas中获取drop_duplicates后剩余行及筛选特定ID日期组合行的高效方法
Pandas中获取drop_duplicates后剩余行及筛选特定ID日期组合行的高效方法
嘿,这个需求其实挺常见的,不用先跑drop_duplicates也能高效解决,直接针对你要的结果处理反而更简洁。让我一步步给你拆解:
首先,你的核心需求是:找出所有date="22-08"的行,且这些行的id从未在date="21-08"的记录里出现过——不管其他列(比如price、desc)有没有变化,只关注id和date的组合存在性。
方法一:用集合差集快速定位目标ID
这种方法逻辑直观,运算效率也很高,适合数据量较大的场景:
# 先提取所有在21-08出现过的ID ids_in_21 = set(df[df['date'] == '21-08']['id']) # 筛选22-08的行,且ID不在21-08的集合里 result = df[(df['date'] == '22-08') & (~df['id'].isin(ids_in_21))]
运行这段代码后,result就会精准返回你要的id=125的那一行。
方法二:用groupby + filter 灵活扩展
如果后续需要扩展到更多日期的对比逻辑,这种方法的适配性更强:
# 按id分组,筛选出分组内不包含21-08日期的所有行 filtered_groups = df.groupby('id').filter(lambda x: '21-08' not in x['date'].values) # 再从中提取出date为22-08的目标行 result = filtered_groups[filtered_groups['date'] == '22-08']
只要调整lambda里的条件,就能轻松应对类似“只在某几个日期出现的ID”这类需求。
关于你提到的drop_duplicates思路
如果你的原始数据里有大量重复的id+date组合,确实可以先去重再处理:
# 先对id和date列去重,保留唯一组合 deduped_df = df.drop_duplicates(subset=['id', 'date']) # 复用方法一的逻辑筛选目标ID ids_in_21 = set(deduped_df[deduped_df['date'] == '21-08']['id']) deduped_result = deduped_df[(deduped_df['date'] == '22-08') & (~deduped_df['id'].isin(ids_in_21))] # 如果需要保留原始行的完整信息,再用筛选出的ID回查原数据 full_result = df[(df['date'] == '22-08') & (df['id'].isin(deduped_result['id']))]
不过其实第一步去重不是必须的,因为set()会自动对ID去重,直接用原始数据处理反而少一步操作,效率更高。
结果验证
用你给出的测试数据运行上述方法,最终得到的结果都是:
id date price desc 4 125 22-08 4000 baz
完全符合你的预期。
备注:内容来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

