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

基于Lookup Table按ID匹配起始日期,将DataFrame早于该日期的数据置零

需求说明

使用Lookup Table查找对应唯一ID的起始日期,将目标DataFrame中各ID列早于对应起始日期的数据置零。

Lookup Table(按唯一ID匹配起始日期)

MNI_IDStartDate
MNWIS-1310/1/1967
MNWIS-1212/1/1967
MDWR-11/1/1968
MW-152/1/1968

目标DataFrame(df)

日期MNWIS-13MNWIS-12MDWR-1MW-15
10/1/196712.3022.001.0017.00
11/1/196711.0033.0023.0080.00
12/1/196745.00555.0043.0045.00
1/1/196856.60405.0069.0067.00
2/1/196845.0033.0020.0029.00

期望结果DataFrame

日期MNWIS-13MNWIS-12MDWR-1MW-15
10/1/196712.30000
11/1/196711.00000
12/1/196745.00555.0000
1/1/196856.60405.0069.000
2/1/196845.0033.0020.0029.00

解决方案代码

通过统一日期类型后,逐列对比起始日期并置零:

import pandas as pd

# 构建Lookup Table并处理日期格式
lookup = pd.DataFrame({
    'MNI_ID': ['MNWIS-13', 'MNWIS-12', 'MDWR-1', 'MW-15'],
    'StartDate': ['10/1/1967', '12/1/1967', '1/1/1968', '2/1/1968']
})
lookup['StartDate'] = pd.to_datetime(lookup['StartDate'], format='%m/%d/%Y')
lookup = lookup.set_index('MNI_ID')['StartDate']

# 构建目标DataFrame并处理日期索引
df_data = {
    'MNWIS-13': [12.30, 11.00, 45.00, 56.60, 45.00],
    'MNWIS-12': [22.00, 33.00, 555.00, 405.00, 33.00],
    'MDWR-1': [1.00, 23.00, 43.00, 69.00, 20.00],
    'MW-15': [17.00, 80.00, 45.00, 67.00, 29.00]
}
date_index = pd.to_datetime(['10/1/1967', '11/1/1967', '12/1/1967', '1/1/1968', '2/1/1968'], format='%m/%d/%Y')
df = pd.DataFrame(df_data, index=date_index)

# 生成日期对比掩码,批量置零
date_mask = df.index.to_series().apply(lambda x: x >= lookup).T
df = df.where(date_mask, 0)

# 恢复原日期格式输出
df.index = df.index.strftime('%m/%d/%Y')
print(df)

代码说明

  1. 日期标准化:将Lookup和目标DataFrame的日期统一转为datetime类型,避免字符串比较误差。
  2. 掩码批量处理:生成布尔掩码矩阵,一次性判断所有单元格是否符合日期要求,比逐行遍历效率更高。
  3. 格式还原:将处理后的索引日期转回原字符串格式,与期望输出一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:22:20