Pandas分组聚合时获取非聚合列对应值的实现方法
解决方法
要实现按species分组后获取sepal_length最小值对应的petal_width_class,核心是找到每个组里sepal_length最小的那一行,而非单独对列做聚合。这里有两种简单的实现方式:
方法一:用idxmin()定位索引后提取行
idxmin()会返回每个分组中指定列最小值所在的行索引,通过这些索引就能直接从原DataFrame中取出完整的目标行:
# 获取每个species组中sepal_length最小的行索引 min_row_indices = iris.groupby("species")["sepal_length"].idxmin() # 根据索引提取对应的行,保留需要的列 result = iris.loc[min_row_indices, ["species", "sepal_length", "petal_width_class"]] # 重置索引(可选,让结果更整洁) result = result.reset_index(drop=True)
方法二:用sort_values()结合groupby().first()
先按species分组,再在每个组内按sepal_length升序排序,最后取每个组的第一行(也就是最小值对应的行):
# 先按species分组,组内按sepal_length升序排序,然后取每组第一行 result = iris.sort_values(["species", "sepal_length"]).groupby("species").first().reset_index(drop=False) # 保留需要的列 result = result[["species", "sepal_length", "petal_width_class"]]
为什么你的原代码不符合需求?
- 第一种代码仅对
sepal_length做聚合,自然不会返回petal_width_class; - 第二种代码是分别对
petal_width_class和sepal_length取最小值(字符串类型的petal_width_class会按字母顺序取最小,比如"a"比"b"小),和sepal_length最小值对应的行没有关联。
内容的提问来源于stack exchange,提问作者imantha
相关产品推荐
相关产品推荐

