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

Pandas筛选指定值在两列中出现的最早日期行

解决方法

核心需求是找到值1、5、4在a或b列中首次出现的日期,再保留这些日期对应的行。你的原代码问题在于筛选了所有包含目标值的行,没有剔除后续重复出现同一值的行。

步骤1:预处理日期格式(推荐)

先把date列转为datetime类型,确保日期比较的准确性:

import pandas as pd

zed = pd.DataFrame(data = { 
    'date': ['2022-03-01', '2022-03-02', '2022-03-03', '2022-03-04', '2022-03-05'], 
    'a': [1, 5, 7, 3, 4], 
    'b': [3, 4, 9, 12, 5] 
})
zed['date'] = pd.to_datetime(zed['date'])

步骤2:提取每个目标值的最早出现日期

将宽表转为长格式,方便按值追踪最早出现的日期:

# 转换为长格式,保留日期、列名和对应值
melted = zed.melt(id_vars='date', value_vars=['a', 'b'], value_name='val')
# 筛选目标值,分组后取每个值的最小日期,去重得到唯一的最早日期集合
earliest_dates = melted[melted['val'].isin([1, 5, 4])].groupby('val')['date'].min().unique()

步骤3:筛选原DataFrame中对应最早日期的行

result = zed[zed['date'].isin(earliest_dates)].sort_values('date')
print(result)

运行结果:

date  a   b
0 2022-03-01  1   3
1 2022-03-02  5   4

原代码问题说明

你的原代码zed[zed.isin({'a': [1, 5, 4], 'b': [1, 5, 4]}).any(1)].sort_values(by=['date'])会选中所有包含目标值的行,包括2022-03-05(a列的4),但这个4的首次出现是在2022-03-02的b列,因此这一行不需要保留。我们的方法通过先提取每个值的最早日期,再筛选对应行,精准解决了这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:30:49