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

如何按日期条件与NaN规则筛选符合要求的DataFrame记录

问题

现有如下DataFrame:

index    col1                     col2                   col3
    0      2022-09-25 21:00:00    2022-09-25 20:00:00       NaN
    1      2022-09-25 21:26:00        NaN                   NaN
    2      2022-09-25 21:00:00    2022-09-25 22:00:00     2022-09-25 23:00:00
    3      2022-09-25 21:00:00    2022-09-25 22:00:00     2022-09-25 20:00:00
    4      2022-09-25 21:00:00    2022-09-25 23:00:00       NaN

需要筛选满足col1 < col2且col2 < col3的行,规则是任何日期与NaN比较时,date < NaN判定为真。预期输出如下:

index    col1                     col2                   col3
    1      2022-09-25 21:26:00        NaN                   NaN
    2      2022-09-25 21:00:00    2022-09-25 22:00:00     2022-09-25 23:00:00
    4      2022-09-25 21:00:00    2022-09-25 23:00:00       NaN

其中索引0因col1 > col2被剔除,索引3因col2 > col3被剔除,求实现该筛选的方法。

解决方案

可以利用Pandas的lt()方法结合fillna(True)实现需求,以下是具体步骤:

1. 确保列是日期类型

如果col1、col2、col3还未转换为datetime类型,先执行转换:

import pandas as pd

df['col1'] = pd.to_datetime(df['col1'])
df['col2'] = pd.to_datetime(df['col2'])
df['col3'] = pd.to_datetime(df['col3'])

2. 构建筛选条件

分别判断col1 < col2和col2 < col3,对比较结果中的缺失值(即其中一方为NaN的情况)填充为True,匹配规则要求:

cond1 = df['col1'].lt(df['col2']).fillna(True)
cond2 = df['col2'].lt(df['col3']).fillna(True)

3. 筛选符合条件的行

将两个条件用&组合,筛选出同时满足要求的行:

result = df[cond1 & cond2]

完整代码示例

import pandas as pd

# 构造原始DataFrame
data = {
    'col1': ['2022-09-25 21:00:00', '2022-09-25 21:26:00', '2022-09-25 21:00:00', '2022-09-25 21:00:00', '2022-09-25 21:00:00'],
    'col2': ['2022-09-25 20:00:00', None, '2022-09-25 22:00:00', '2022-09-25 22:00:00', '2022-09-25 23:00:00'],
    'col3': [None, None, '2022-09-25 23:00:00', '2022-09-25 20:00:00', None]
}
df = pd.DataFrame(data)

# 转换为日期类型
df['col1'] = pd.to_datetime(df['col1'])
df['col2'] = pd.to_datetime(df['col2'])
df['col3'] = pd.to_datetime(df['col3'])

# 构建筛选条件
cond1 = df['col1'].lt(df['col2']).fillna(True)
cond2 = df['col2'].lt(df['col3']).fillna(True)

# 筛选结果
result = df[cond1 & cond2]
print(result)

逻辑说明

  • lt()方法会返回布尔Series,当比较双方有一个是NaN时,结果为NaN
  • fillna(True)将这些NaN替换为True,完全符合"date < NaN判定为真"的规则
  • 两个条件同时满足(&)时,保留该行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:55:24