如何筛选DataFrame中sample_received或result_received≥指定日期的行?
按日期条件筛选DataFrame行
原始数据
用户提供的DataFrame如下:
import pandas as pd df = {'sample_received': {1: 'NaN', 2: 'NaN', 17: 'NaN', 3: 'NaN', 4: 'NaN', 5: 'NaN', 6: 'NaN', 7: 'NaN', 8: 'NaN', 9: 'NaN', 10: 'NaN', 11: 'NaN', 12: 'NaN', 13: 'NaN', 14: '2022-08-01 20:15:28', 15: '2022-08-01 20:12:56', 16: '2022-08-01 20:18:19'}, 'result_received': {1: '2022-07-28 12:25:37', 2: '2022-07-30 12:37:37', 17: '2022-07-28 12:45:37', 3: '2022-07-28 12:48:37', 4: '2022-07-28 12:49:37', 5: '2022-07-28 12:50:37', 6: '2022-07-28 12:21:37', 7: '2022-07-28 12:52:37', 8: '2022-07-28 12:54:37', 9: '2022-08-01 11:55:40', 10: '2022-08-01 13:56:15', 11: '2022-08-01 13:57:15', 12: '2022-08-01 13:58:28', 13: '2022-08-01 13:59:28', 14: '2022-08-02 08:33:39', 15: '2022-08-02 08:35:39', 16: '2022-08-02 08::39'}, 'status': {1: 'Failed', 2: 'Failed', 17: 'Approved', 3: 'Approved', 4: 'Approved', 5: 'Approved', 6: 'Approved', 7: 'Approved', 8: 'Approved', 9: 'Approved', 10: 'Approved', 11: 'Approved', 12: 'Approved', 13: 'Approved', 14: 'Approved', 15: 'Approved', 16: 'Approved'}} df = pd.DataFrame(df)
需求说明
筛选满足以下任一条件的行:
sample_received列日期≥2022年8月1日(该列存在字符串'NaN'形式的缺失值,此时只需result_received列符合条件即可保留)result_received列日期≥2022年8月1日(同理,该列若有格式错误或缺失,不影响另一列的判断)
解决方案
步骤1:转换日期列并处理错误值
先将两个日期列转为datetime类型,把无效值(字符串'NaN'、格式错误的日期)自动转为缺失值pd.NaT:
# errors='coerce'将无效格式转为NaT df['sample_received'] = pd.to_datetime(df['sample_received'], errors='coerce') df['result_received'] = pd.to_datetime(df['result_received'], errors='coerce')
步骤2:定义筛选条件并筛选
利用布尔索引实现"或"逻辑筛选,pd.NaT在比较时会返回False,因此当某一列是缺失值时,只会判断另一列的条件:
# 构建筛选条件 filter_condition = (df['sample_received'] >= '2022-08-01') | (df['result_received'] >= '2022-08-01') # 应用筛选得到结果 filtered_df = df[filter_condition]
最终结果
执行后,filtered_df会包含索引为9、10、11、12、13、14、15、16的行,这些行均满足任一日期列≥2022年8月1日的条件。
内容的提问来源于stack exchange,提问作者TimS
相关产品推荐
相关产品推荐

