import pandas as pdimport numpy as np# 构造测试数据np.random.seed(42)data = { "date": pd.date_range("2026-07-01", periods=20).repeat(3), "area": ["华东", "华北", "华南"] * 20, "product": ["A", "B", "C"] * 20, "sales": np.random.randint(100, 1000, size=60).astype(float)}df = pd.DataFrame(data)# 人为制造缺失值df.loc[[5,12,18,25,33,41,48,55], "sales"] = np.nan# 标记节假日模拟df["is_holiday"] = df["date"].dt.day.isin([2,9,16])# 1.分组得到每个(area,product)的中位数group_median = df.groupby(["area","product"])["sales"].transform("median")# 2.复合条件填充cond_holiday = df["is_holiday"] == Truecond_workday = df["is_holiday"] == Falsedf.loc[cond_holiday & df["sales"].isna(), "sales"] = 0df.loc[cond_workday & df["sales"].isna(), "sales"] = group_medianprint(df[df["sales"].isna()].shape)print(df.head(10))