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

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。实际上需要处理的是列名中的日期字符串,而非单元格内的数值。

正确实现方法

步骤分解

  1. 提取所有日期列,转换为datetime类型,筛选出非周末的日期列,并按日期降序排序。
  2. 从排序后的非周末日期列中选取最晚的三个。
  3. 检查每行在这三个列中的数值是否全为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:07:44