如何用Pandas基于收货日期与定价日期填充产品表缺失价格
用Pandas实现按日期关联填充产品价格
步骤1:先把日期列转成可比较的格式
首先得把receipt dates(收货日期)和DATE OF GIVEN PRICE(定价日期)这两列转成Pandas的datetime类型,不然字符串没法正确比较日期大小:
import pandas as pd # 读取你的数据(这里假设是Excel文件,按需替换成read_csv等) df = pd.read_excel("你的文件路径.xlsx") # 转换日期列格式 df["receipt dates"] = pd.to_datetime(df["receipt dates"]) df["DATE OF GIVEN PRICE"] = pd.to_datetime(df["DATE OF GIVEN PRICE"])
步骤2:按产品分组处理价格填充
因为不同产品的定价规则是独立的,所以要按产品名称分组处理,分两种常见情况:
情况1:每个产品只有一个定价(仅一行有价格值)
如果每个产品只有一行有价格和对应的定价日期,其他行价格为空,直接提取该产品的定价信息,给符合日期条件的行填充:
# 提取每个产品的定价日期和对应价格 product_pricing = df.dropna(subset=["prices"]).set_index("产品名称")[["DATE OF GIVEN PRICE", "prices"]] # 把定价信息合并回原表,让每个产品行都能拿到自己的定价数据 df = df.merge(product_pricing, on="产品名称", suffixes=("", "_fixed")) # 填充价格:仅当原价格为空,且收货日期晚于定价日期时,用提取到的定价填充 df["prices"] = df.apply( lambda row: row["prices_fixed"] if pd.isna(row["prices"]) and row["receipt dates"] > row["DATE OF GIVEN PRICE_fixed"] else row["prices"], axis=1 ) # 删掉临时生成的辅助列 df = df.drop(columns=["DATE OF GIVEN PRICE_fixed", "prices_fixed"])
情况2:每个产品有多个定价(多行有不同价格和定价日期)
如果产品存在多个定价节点,需要给每个收货日期匹配最新的、定价日期早于收货日期的价格,可以结合ffill和日期筛选实现:
# 先按产品名称+定价日期排序,保证定价顺序正确 df = df.sort_values(by=["产品名称", "DATE OF GIVEN PRICE"]) # 分组后向前填充价格,但只保留收货日期晚于对应定价日期的填充结果 df["prices"] = df.groupby("产品名称").apply( lambda group: group["prices"].ffill().where(group["receipt dates"] >= group["DATE OF GIVEN PRICE"].ffill()) ).reset_index(drop=True)
验证结果
处理完成后可以直接打印查看结果是否符合预期:
print(df)
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

