You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas pivot_table设置dropna=False仍不显示NA列,无需新增列如何解决?

问题描述

我有一个包含_merge和A两列的DataFrame,其中A列为object类型,包含部分有效值及NA。使用pivot_table统计配对数量时,NA值丢失,即使设置dropna=False也无法显示。

代码示例:

import pandas as pd

df= pd.DataFrame({
    '_merge':['left_only', 'both','right_only', 'right_only'],
    'A':['1', '1','2',pd.NA]
})

# 执行后透视表不包含NA列
df.pivot_table(index='_merge', columns='A', aggfunc='size', fill_value='-', dropna=False)

手动将NA填充为'NA'后可显示对应列,但不想在源DataFrame中新增列,请问如何直接得到包含NA列的透视表?

解决方案

无需修改源DataFrame,可通过以下两种方式实现:

方法1:在columns参数中临时填充NA

直接在columns参数里对A列做临时填充操作,不会改变原DataFrame:

df.pivot_table(
    index='_merge',
    columns=df['A'].fillna('NA'),
    aggfunc='size',
    fill_value='-',
    dropna=False
)

方法2:将A列转为分类类型

把A列转为包含NA的分类类型,强制pivot_table保留所有类别(包括NA):

# 生成包含所有唯一值(含NA)的分类对象
cat_A = pd.Categorical(df['A'], categories=df['A'].unique(), ordered=False)

df.pivot_table(
    index='_merge',
    columns=cat_A,
    aggfunc='size',
    fill_value='-',
    dropna=False
)

原理说明

pandas的pivot_table处理object类型列时,即便设置dropna=False,默认仍会忽略NA类别。转为分类类型后,会强制保留所有定义的类别;临时填充则是将NA替换为可识别的字符串,避免被过滤。

内容的提问来源于stack exchange,提问作者euh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:52:09