Pandas筛选:排除周末的最近三日零值行实现方案
筛选Pandas DataFrame中符合条件的行:连续三个非周末日期数值均为0.0
需求说明
需要从DataFrame中筛选出满足以下条件的行:从最晚的日期列开始,跳过周末(周六、周日),连续三个非周末日期对应的列数值均为0.0。
给定数据集与初始化代码
import pandas as pd data = { 'ID': [1, 2, 3], 'holder': ['Max', 'Max', 'Max'], 'state': ['Test', 'Test', 'Test'], '2023-08-06': [0.0, 0.0, 0.0], '2023-08-07': [5.0, 0.0, 0.0], '2023-08-08': [0.0, 3.0, 6.0], '2023-08-09': [0.0, 5.0, 0.0], '2023-08-10': [0.0, 5.0, 0.0], '2023-08-11': [0.0, 0.0, 0.0], '2023-08-12': [0.0, 0.0, 0.0], '2023-08-13': [0.0, 0.0, 0.0] } df = pd.DataFrame(data)
期望筛选结果
仅保留ID为1和3的行:
ID holder state 2023-08-06 2023-08-07 2023-08-08 2023-08-09 2023-08-10 2023-08-11 2023-08-12 2023-08-13 0 1 Max Test 0.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 2 3 Max Test 0.0 0.0 6.0 0.0 0.0 0.0 0.0 0.0
错误尝试分析
之前的代码错误地将单元格中的数值当作日期处理,导致AttributeError。实际上需要处理的是列名中的日期字符串,而非单元格内的数值。
正确实现方法
步骤分解
- 提取所有日期列,转换为
datetime类型,筛选出非周末的日期列,并按日期降序排序。 - 从排序后的非周末日期列中选取最晚的三个。
- 检查每行在这三个列中的数值是否全为0.0,筛选符合条件的行。
完整代码
# 1. 提取日期列并处理 date_cols = [col for col in df.columns if col not in ['ID', 'holder', 'state']] # 转换为datetime并排除周末(weekday()<5对应周一至周五) date_series = pd.to_datetime(date_cols) non_weekend_dates = date_series[date_series.weekday() < 5] # 按日期降序排序,取最晚的三个非周末日期,转回字符串格式 target_dates = non_weekend_dates.sort_values(ascending=False).head(3).strftime('%Y-%m-%d') # 2. 筛选符合条件的行 filtered_df = df[df[target_dates].eq(0.0).all(axis=1)] print(filtered_df)
代码解释
- 日期列处理:先过滤出非属性类的日期列,将列名转为
datetime后排除周末日期,再按日期从晚到早排序,取前三个即为需要检查的最晚三个非周末日期。 - 行筛选:通过
eq(0.0).all(axis=1)检查每行在目标日期列中的值是否全部为0.0,保留满足条件的行。
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

