基于Lookup Table按ID匹配起始日期,将DataFrame早于该日期的数据置零
需求说明
使用Lookup Table查找对应唯一ID的起始日期,将目标DataFrame中各ID列早于对应起始日期的数据置零。
Lookup Table(按唯一ID匹配起始日期)
| MNI_ID | StartDate |
|---|---|
| MNWIS-13 | 10/1/1967 |
| MNWIS-12 | 12/1/1967 |
| MDWR-1 | 1/1/1968 |
| MW-15 | 2/1/1968 |
目标DataFrame(df)
| 日期 | MNWIS-13 | MNWIS-12 | MDWR-1 | MW-15 |
|---|---|---|---|---|
| 10/1/1967 | 12.30 | 22.00 | 1.00 | 17.00 |
| 11/1/1967 | 11.00 | 33.00 | 23.00 | 80.00 |
| 12/1/1967 | 45.00 | 555.00 | 43.00 | 45.00 |
| 1/1/1968 | 56.60 | 405.00 | 69.00 | 67.00 |
| 2/1/1968 | 45.00 | 33.00 | 20.00 | 29.00 |
期望结果DataFrame
| 日期 | MNWIS-13 | MNWIS-12 | MDWR-1 | MW-15 |
|---|---|---|---|---|
| 10/1/1967 | 12.30 | 0 | 0 | 0 |
| 11/1/1967 | 11.00 | 0 | 0 | 0 |
| 12/1/1967 | 45.00 | 555.00 | 0 | 0 |
| 1/1/1968 | 56.60 | 405.00 | 69.00 | 0 |
| 2/1/1968 | 45.00 | 33.00 | 20.00 | 29.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)
代码说明
- 日期标准化:将Lookup和目标DataFrame的日期统一转为
datetime类型,避免字符串比较误差。 - 掩码批量处理:生成布尔掩码矩阵,一次性判断所有单元格是否符合日期要求,比逐行遍历效率更高。
- 格式还原:将处理后的索引日期转回原字符串格式,与期望输出一致。
内容的提问来源于stack exchange,提问作者user11958450
相关产品推荐
相关产品推荐

