pandas 如何在 pivot_table 里对缺失值做不同填充策略

11次阅读

pandas.pivot_table中缺失值处理需分场景:fill_value仅填充未出现的行列组合;常用fillna对结果灵活填充;也可在aggfunc中定制聚合逻辑;margins行同样受fill_value影响。

pandas 如何在 pivot_table 里对缺失值做不同填充策略

pandas.pivot_table 中,缺失值(NaN)的填充不能直接通过 pivot_table 参数完成,而是需要在调用后或通过 aggfunc 配合自定义函数间接实现。核心思路是:先生成透视表,再对结果中的 NaN 做填充;或在聚合阶段就控制缺失值的处理逻辑。

用 fill_value 参数做统一常量填充

fill_valuepivot_table 唯一原生支持的缺失值处理参数,适用于所有未覆盖单元格(即组合不存在时),用指定值替换 NaN:

  • 只影响“完全未出现的行列组合”,不处理聚合结果本身为 NaN 的情况(如某组全为 NaN)
  • 接受数字、字符串、None 等,例如 fill_value=0fill_value="N/A"
  • 示例:pd.pivot_table(df, values='sales', index='region', columns='month', fill_value=0)

先聚合后用 fillna 做灵活填充

更常用也更可控的方式:生成 pivot_table 后,对返回的 DataFrame 或 Series 调用 fillna(),支持多种策略:

  • fillna(0):全填 0
  • fillna(method='ffill'):按行/列前向填充
  • fillna(df.mean()):按列均值填充(需注意 axis)
  • fillna({'Jan': 100, 'Feb': 120}):按列指定不同值

注意:若 pivot_table 返回的是 MultiIndex DataFrame,fillna 仍可正常作用于数值列。

在 aggfunc 中嵌入缺失值逻辑

对聚合过程本身定制处理,比如跳过 NaN、返回特定默认值,或按组内统计量填充:

  • Lambda 包裹内置函数:如 aggfunc=lambda x: np.nanmean(x) if not x.isna().all() else -1
  • 结合 skipna=False 强制保留 NaN,再后续统一处理
  • 使用 pd.NamedAgg 对不同列应用不同逻辑,例如销售额用均值,订单数用 0 填充

用 margins + fill_value 处理小计/总计行的缺失

开启 margins=True 后,小计行/列也可能含 NaN。此时 fill_value 同样生效,但要注意:

  • 它对 margin 单元格同样适用,无需额外操作
  • 若 margin 结果本身是 NaN(如某列全空),fill_value 会覆盖它
  • 如需 margin 行单独处理,建议先生成带 margins 的表,再用 fillna 针对 index.name == 'All' 等条件筛选填充
text=ZqhQzanResources