如何在Pandas DataFrame分组中获取每组第三高的Value值?
解决按ID分组取每组第三高Value的问题
首先明确你的代码问题:grp.nlargest(3).min()的逻辑是取该组最大的3个值,再取其中最小的——这其实等价于该组的第三大值(包含重复值的情况),但如果你的需求是去重后的第三高值,或者组内元素不足3个时需要特殊处理,这个写法就不符合预期。
下面分两种常见需求给出解决方案:
需求1:取每组排序后的第三个最大值(允许重复值,不足3个时返回NaN)
比如组内数据是[10,10,9,8],第三高是9;组内数据是[5,5,5],第三高是5;组内数据只有2个值时返回NaN。
代码写法:
import numpy as np df.groupby('ID')['Value'].apply(lambda grp: grp.sort_values(ascending=False).iloc[2] if len(grp) >= 3 else np.nan)
需求2:取每组去重后的第三个最大值(相同值只算一次,不足3个时返回NaN)
比如组内数据是[10,10,9,8],去重后是[10,9,8],第三高是8;组内数据是[5,5,4],去重后只有2个值,返回NaN。
代码写法:
import numpy as np df.groupby('ID')['Value'].apply(lambda grp: np.sort(grp.unique())[-3] if len(grp.unique()) >= 3 else np.nan)
原代码不符合预期的原因
如果你的组内存在多个重复的高值,比如数据是[10,10,10,8],grp.nlargest(3)会取出三个10,min()结果还是10。如果你的需求是去重后的第三高(也就是8),那原代码就会出错,这时候就需要用需求2的写法。
内容的提问来源于stack exchange,提问作者Ger Gleeson
相关产品推荐
相关产品推荐

