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

基于现有DataFrame生成布尔表:列值在first_valid_date及之后为True否则为False

解决方法

首先确保你的DataFrame索引为datetime类型,转换代码如下:

import pandas as pd
df.index = pd.to_datetime(df.index)

核心实现

写法1:简洁实现(适合中小规模表)

直接对每列做规则判断即可,代码逻辑和需求完全对应:

bool_df = df.apply(lambda s: s.index >= s.first_valid_index())

写法2:高性能实现(适合十万行以上大表)

用numpy广播机制代替逐列遍历,性能提升明显:

# 先计算每列第一个非空值对应日期
col_first_date = df.apply(pd.Series.first_valid_index)
# 广播比较生成布尔矩阵
bool_df = pd.DataFrame(
    df.index.values[:, None] >= col_first_date.values,
    index=df.index,
    columns=df.columns
)

效果验证

用你提供的示例数据运行代码:

# 构造示例DataFrame
data = {
    'A': [1.0,2.0,4.0,None,2.0,9.0,4.0],
    'B': [None,None,3.0,7.0,5.0,None,5.0],
    'C': [None,5.0,None,None,None,5.0,None]
}
df = pd.DataFrame(data, index=pd.to_datetime([
    '2021-08-31','2021-09-01','2021-09-02','2021-09-03',
    '2021-09-06','2021-09-07','2021-09-08'
]))

print(bool_df)

输出结果和预期完全一致:

A      B      C
2021-08-31  True  False  False
2021-09-01  True  False   True
2021-09-02  True   True   True
2021-09-03  True   True   True
2021-09-06  True   True   True
2021-09-07  True   True   True
2021-09-08  True   True   True

注意事项

如果存在全列为NaN的情况,first_valid_index()会返回None,比较会抛出异常,你可以根据需求提前过滤这类列,或者填充默认日期处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:54:04