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

在 pandas.pivot_table 中,缺失值(NaN)的填充不能直接通过 pivot_table 参数完成,而是需要在调用后或通过 aggfunc 配合自定义函数间接实现。核心思路是:先生成透视表,再对结果中的 NaN 做填充;或在聚合阶段就控制缺失值的处理逻辑。
用 fill_value 参数做统一常量填充
fill_value 是 pivot_table 唯一原生支持的缺失值处理参数,适用于所有未覆盖单元格(即组合不存在时),用指定值替换 NaN:
- 只影响“完全未出现的行列组合”,不处理聚合结果本身为 NaN 的情况(如某组全为 NaN)
- 接受数字、字符串、None 等,例如
fill_value=0、fill_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'等条件筛选填充









