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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:10:40