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

Pandas groupby非键列NaN/None被last()忽略如何解决

pandas groupby调用last()时值列空值被自动填充的解决方案

现象复现

当非groupby分组键列存在NaN/None空值时,直接调用last()方法会出现空值被自动补全的表现,复现代码如下:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [1, 2, 1, 2], 'b': [23, 43, np.nan, 12], 'c': ['x', 'y', 'z', None]})
print(df)

原始DataFrame内容:

a     b     c
0  1  23.0     x
1  2  43.0     y
2  1   NaN     z
3  2  12.0  None

执行常规分组取末位值的代码及实际输出:

df.groupby(by='a', as_index=False, dropna=False).last()
a     b  c
0  1  23.0  z
1  2  12.0  y

预期输出应为:

a     b     c
0  1   NaN     z
1  2  12.0  None

设置dropna=False无法解决该问题,因为该参数仅作用于分组键列a,控制分组键本身的空值是否作为独立分组,不影响非键列的取值逻辑。

根因说明

这个表现是pandas的默认设计,不是bug:groupby.last()和对应的groupby.first()方法默认携带参数skipna=True,会自动跳过取值过程中遇到的NaN/None值,向前/向后查找第一个非空值返回,因此才会出现分组最后一行是空值时,返回了上一行非空值的情况。

正规解决方法

无需使用hack技巧,直接在调用last()时显式传入官方公开参数skipna=False即可,该参数从pandas 1.0版本开始稳定支持,专门用于控制值列计算时是否跳过空值:

result = df.groupby(by='a', as_index=False, dropna=False).last(skipna=False)
print(result)

运行后即可得到预期输出:

a     b     c
0  1   NaN     z
1  2  12.0  None

参数说明

  • dropna:分组阶段参数,仅控制分组键列中的空值是否作为独立分组参与计算
  • skipna:取值阶段参数,控制非分组键列在计算/取值时是否跳过空值,两个参数互相独立,按需设置即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:24:34