如何用Python Pandas按日期范围替换DataFrame中的指定值?
Pandas按日期规则替换DataFrame值的实现方案
原始数据
Months 2022-10 2022-11 2022-12 2023-01 … 2023-01 10 N/A 12 13 … 2022-12 2 14 14 N/A … 2022-11 N/A 11 N/A N/A … 2022-10 12 N/A N/A N/A … … … … … …
需求规则
- 若列日期 > 行的Months日期:单元格替换为空白
- 若列日期 ≤ 行的Months日期:原值为
N/A则替换为0,否则保留原值
实现代码及步骤
1. 构造示例数据(可替换为你的实际数据)
import pandas as pd import numpy as np data = { 'Months': ['2023-01', '2022-12', '2022-11', '2022-10'], '2022-10': [10, 2, np.nan, 12], '2022-11': [np.nan, 14, 11, np.nan], '2022-12': [12, 14, np.nan, np.nan], '2023-01': [13, np.nan, np.nan, np.nan] } df = pd.DataFrame(data)
2. 核心处理逻辑
# 转换日期格式:确保Months列和列名的日期都是datetime类型 df['Months'] = pd.to_datetime(df['Months']) date_columns = df.columns[1:] # 提取所有日期列(排除Months) date_cols_dt = pd.to_datetime(date_columns) # 创建布尔掩码:标记每一行中,列日期 ≤ 行Months日期的位置 mask = df['Months'].apply(lambda row_date: date_cols_dt <= row_date).values # 按规则处理数据 # 第一步:将不符合条件(列日期>行日期)的单元格设为空白 processed_df = df[date_columns].where(mask, '') # 第二步:将符合条件但原值为N/A的单元格替换为0 processed_df = processed_df.mask(mask & df[date_columns].isna(), 0) # 合并Months列(转回字符串格式)和处理后的结果 final_result = pd.concat([df['Months'].dt.strftime('%Y-%m'), processed_df], axis=1)
3. 输出结果
运行后得到目标DataFrame:
Months 2022-10 2022-11 2022-12 2023-01 … 2023-01 10 0 12 13 … 2022-12 2 14 14 … 2022-11 0 11 … 2022-10 12 … … … … … …
关键逻辑说明
- 日期类型转换:必须将字符串日期转为
datetime类型,否则字符串比较会出现逻辑错误(比如"2023-01"和"2022-12"字符串比较会误判大小) - 布尔掩码:通过
apply为每行生成对应的布尔数组,精准标记需要处理的单元格范围 - where/mask方法:
where保留符合条件的原值,不符合的设为空白;mask则对符合条件的特定值(N/A)进行替换,两者配合实现规则
内容的提问来源于stack exchange,提问作者Simon GIS
相关产品推荐
相关产品推荐

