基于现有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
相关产品推荐
相关产品推荐

