pandas使用pivot_table时丢弃NaN记录的原因及修复方法
pivot_table 丢失含NaN记录的原因与调整方案
为什么默认的pivot_table操作会自动丢弃你的NaN记录?
pivot_table本质是基于分组聚合的宽表重塑逻辑,你碰到的整行丢失问题来自两个默认配置的叠加:
- 函数默认使用
numpy.mean作为聚合方法,计算均值时会自动跳过组内的NaN值;当某个分组下所有对应的var4值都是NaN时,聚合后该组的输出结果就是NaN。 - 函数默认开启
dropna=True参数,规则是在最终生成的透视表中,剔除所有元素全为NaN的行和列。你的案例里,var2=3对应的分组在透视后只有a列一个字段,取值为NaN,整行没有任何非空内容,刚好触发了这个删除规则,因此被从结果里移除。
调整代码保留NaN记录的实现方法
只需要在原有代码的pivot_table调用中,新增dropna=False参数,就能保留所有索引组合对应的行,哪怕整行都是NaN。
调整后的完整代码如下:
pivot = (df.pivot_table(index=['var2','var3'], columns=['var1'], values='var4', dropna=False) # 关闭全NaN行/列的自动删除 .reset_index() .rename_axis(None, axis=1))
场景适配补充
你的案例里每个分组键组合(var2+var3+var1)只对应唯一一条记录,本身不需要聚合操作,这种场景下也可以直接使用pandas原生的pivot方法完成重塑——这个方法不需要做聚合计算,不存在默认跳过NaN、删除全NaN行的逻辑,代码会更简洁:
pivot = (df.pivot(index=['var2','var3'], columns=['var1'], values='var4') .reset_index() .rename_axis(None, axis=1))
运行上述任意一段调整后的代码,都能得到你预期的、保留NaN记录的完整透视结果。
内容的提问来源于stack exchange,提问作者flying_fluid_four
相关产品推荐
相关产品推荐

