在Pandas中获取分组max()/min()且不忽略NaN值的方法
分组计算含NaN列的最大值(不忽略NaN)
先给出示例数据:
import pandas as pd import numpy as np df = pd.DataFrame({'group' : [1, 2, 2], 'x' : [1, 2, 3], 'y' : [2, 3, np.nan]})
单独计算列y的最大值且不忽略NaN时,执行df.y.max(skipna=False)可得到预期结果nan,但分组后调用df.groupby('group').y.max(skipna=False)会报错TypeError: max() got an unexpected keyword argument 'skipna',因为DataFrameGroupBy.max()不支持skipna参数,可通过以下两种方法实现需求:
方法1:使用agg()结合lambda函数
通过groupby.agg()自定义聚合逻辑,直接调用Series原生的max()方法并传入skipna=False:
df.groupby('group')['y'].agg(lambda s: s.max(skipna=False))
执行结果:
group 1 2.0 2 NaN Name: y, dtype: float64
方法2:使用apply()方法
对每个分组应用Series的max()方法:
df.groupby('group')['y'].apply(lambda s: s.max(skipna=False))
返回结果与方法1完全一致。
说明
上述两种方法均绕过分组默认的max()实现,直接调用支持skipna参数的Series原生方法。若分组内的y列存在NaN,结果返回NaN;仅当分组内所有y值均非空时,返回实际最大值。
内容的提问来源于stack exchange,提问作者PingPong
相关产品推荐
相关产品推荐

