如何将DataFrame的EndDate匹配到Date列并向前填充Value
Pandas:匹配EndDate到对应Date位置并向前填充Value
步骤1:转换日期列类型
先将所有日期字符串转为datetime类型,避免字符串匹配的误差:
import pandas as pd # 原始数据 df = pd.DataFrame({ 'Date': ['1/1/2022', '1/2/2022', '1/3/2022', '1/4/2022', '1/5/2022', '1/6/2022', '1/7/2022', '1/8/2022','1/9/2022'], 'Value': [None, 10, None, 15, None, None, 50, None,None], 'StartDate': [None, '1/2/2022', None, '1/4/2022', None, None, '1/7/2022', None, None], 'EndDate': [None, '1/3/2022', None, '1/6/2022', None, None, '1/9/2022', None,None] }) # 转换日期列为datetime类型 df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y') df['StartDate'] = pd.to_datetime(df['StartDate'], format='%m/%d/%Y') df['EndDate'] = pd.to_datetime(df['EndDate'], format='%m/%d/%Y')
步骤2:生成NewDate列
通过构建EndDate映射字典,将EndDate匹配到Date列对应的行:
# 提取非空的EndDate,构建{日期:日期}的映射字典 end_date_map = df.loc[df['EndDate'].notna(), 'EndDate'].to_dict() # 用Date列匹配映射,生成NewDate(仅当Date等于某个EndDate时填充,否则为NaN) df['NewDate'] = df['Date'].map(end_date_map)
步骤3:基于NewDate区间向前填充Value
无需循环,用分组方式高效实现区间内的向前填充:
# 生成分组标识:每遇到一个非空的NewDate,分组ID递增 group_ids = df['NewDate'].notna().cumsum() # 按分组对Value列执行向前填充 df['Value'] = df.groupby(group_ids)['Value'].ffill()
最终结果
处理后的DataFrame与期望输出一致(可选转换回字符串格式对齐原始数据):
# 转换回字符串格式 df['Date'] = df['Date'].dt.strftime('%m/%d/%Y') df['StartDate'] = df['StartDate'].dt.strftime('%m/%d/%Y').where(df['StartDate'].notna(), None) df['EndDate'] = df['EndDate'].dt.strftime('%m/%d/%Y').where(df['EndDate'].notna(), None) df['NewDate'] = df['NewDate'].dt.strftime('%m/%d/%Y').where(df['NewDate'].notna(), None) print(df)
输出:
Date Value StartDate EndDate NewDate 0 01/01/2022 None None None None 1 01/02/2022 10.0 01/02/2022 01/03/2022 None 2 01/03/2022 10.0 None None 01/03/2022 3 01/04/2022 15.0 01/04/2022 01/06/2022 None 4 01/05/2022 15.0 None None None 5 01/06/2022 15.0 None None 01/06/2022 6 01/07/2022 50.0 01/07/2022 01/09/2022 None 7 01/08/2022 50.0 None None None 8 01/09/2022 50.0 None None 01/09/2022
内容的提问来源于stack exchange,提问作者Nazmi Husaini
相关产品推荐
相关产品推荐

