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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 15:50:27