当前位置:首页>python>Python(Pandas 缺失值高级处理:复合条件填充)

Python(Pandas 缺失值高级处理:复合条件填充)

  • 2026-10-11 06:57:16
Python(Pandas 缺失值高级处理:复合条件填充)
业务数据表经常存在非随机缺失值,简单使用fillna全局填充会破坏业务逻辑。比如销售数据,不同区域、不同产品维度的空值填充规则完全不一样。本篇讲解基于分组+多条件的缺失值填充,解决全局填充带来的数据失真问题。
场景:销售业务数据表,字段:date(日期),area(地区),product(产品),sales(销售额)。部分sales为空;规则:同地区同产品,若为工作日缺失使用该分组中位数填充;节假日缺失直接填0。不能直接df['sales'].fillna(df['sales'].median())全局处理,否则跨地区跨产品数据被污染。

代码示例

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))

输出结果

核心总结

  1. transform可以直接将分组统计值映射回原DataFrame行,避免merge操作;
  2. 区分缺失类型:业务意义上为0的空缺,和采集漏传的空缺,填充策略必须分开;
  3. 禁止无脑全局fillna,多维度业务数据优先使用分组条件填充;
  4. 清洗后务必校验剩余空值数量,用于数据质量监控。

最新文章

随机文章