如何按日期条件与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时,结果为NaNfillna(True)将这些NaN替换为True,完全符合"date < NaN判定为真"的规则- 两个条件同时满足(
&)时,保留该行
内容的提问来源于stack exchange,提问作者user2512443
相关产品推荐
相关产品推荐

