如何过滤pandas DataFrame,判断同出发到达组合是否存在未来出发日期
解决方法
首先将日期字段转为标准日期类型(避免字符串排序出现异常),之后按org和des分组,对分组内的日期升序排序后,判断当前行是否存在后续行即可生成目标字段:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'org': ['A', 'A', 'A', 'B', 'B'], 'des': ['a', 'a', 'a', 'b', 'b'], 'eff_departureDate': ['20200101', '20200102', '20200103', '20200101', '20200102'] }) # 1. 转换日期格式 df['eff_departureDate'] = pd.to_datetime(df['eff_departureDate'], format='%Y%m%d') # 2. 按org、des分组生成has_future_dates字段 # 对每个分组内的日期升序排序后,shift(-1)会将下一行值移到当前行,非空即说明存在更晚日期 df = df.sort_values(['org', 'des', 'eff_departureDate']) df['has_future_dates'] = df.groupby(['org', 'des'])['eff_departureDate'].shift(-1).notna() # 3. 基于新增字段过滤,示例为仅保留存在后续日期的记录 filtered_df = df[df['has_future_dates'] == True]
运行后df输出结果和预期完全一致:
| org | des | eff_departureDate | has_future_dates |
|---|---|---|---|
| A | a | 2020-01-01 | True |
| A | a | 2020-01-02 | True |
| A | a | 2020-01-03 | False |
| B | b | 2020-01-01 | True |
| B | b | 2020-01-02 | False |
如果需要保留原始数据的行顺序,处理完字段后执行以下代码恢复即可:
df = df.sort_index()
内容的提问来源于stack exchange,提问作者Mohan
相关产品推荐
相关产品推荐

