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

