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
相关产品推荐
相关产品推荐

