Pandas DataFrame日期字段比较问题:筛选2020年前数据结果恒为True如何解决
问题排查与解决方案
方法1存在的问题
- 循环赋值逻辑错误:每次循环都对
boolCol整列进行赋值,而非仅修改当前行的取值,最终整列的布尔值完全等于最后一行的比较结果,若最后一行日期早于2020-01-01,整列就会全为True。 - 列取值风险:
df.iloc[row,0]默认取第一列的值,若你的date列不是DataFrame的第一列,比较的取值源就是错的。 - 性能冗余:Pandas支持向量化操作,完全不需要用循环逐行处理,效率极低。
方法2存在的问题
- 无效条件冗余:
df['date'] >= start_date的条件恒成立,start_date是date列的最小值,所有行的date值必然大于等于最小值,这个条件相当于没加。 - 逻辑匹配问题:你要筛选2020年之前的数据,用
<=2020-01-01会把2020年1月1日当天的数据也包含进去,符合预期的话可以保留,否则应该用严格小于<。 - 全为True的核心原因:如果你当前DataFrame的所有date值本身都早于等于2020-01-01,那么最终的mask自然全部为True。
正确实现代码
不需要写循环,直接用向量化判断即可:
import pandas as pd # 先确保date列转为datetime类型 df['date'] = pd.to_datetime(df['date']) # 直接筛选2020年1月1日之前的所有数据 df_before_2020 = df[df['date'] < '2020-01-01'] # 如果需要单独生成布尔列可以直接赋值 df['is_before_2020'] = df['date'] < '2020-01-01'
内容的提问来源于stack exchange,提问作者Konner Smith
相关产品推荐
相关产品推荐

