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
相关产品推荐
相关产品推荐

