Polars分组后按指定列排序取首行并保留所有列
在Polars中按分组内指定列排序并保留整行数据
要实现按foo分组、每组内按bar排序后保留对应整行(包含baz列)的需求,且避免全局排序的额外开销,你可以直接在聚合阶段让所有列跟随bar的排序逻辑,从而保证列之间的关联关系。
最优高效解法
使用group_by结合agg,通过sort_by让每组内的所有列按bar排序,再取第一行即可:
df_solution = df.group_by("foo").agg( pl.all().sort_by("bar").first() ).sort("foo") # 验证结果符合预期 assert df_desired.equals(df_solution)
逻辑说明
pl.all()选中DataFrame的所有列;sort_by("bar")让每组内的所有列按照bar列的升序(示例中取的是每组最小bar对应的行)重新排序;first()取排序后的第一行,这样baz列会自动匹配对应bar值的行,不会出现关联错位;- 最后
sort("foo")保证结果按foo列顺序排列,和目标输出一致。
对比其他方法的优势
- 相比先全局排序再分组:这种分组内排序的方式避免了对整个数据集做排序,当分组规模较小时,性能开销会显著降低;
- 相比单独聚合
bar列:通过sort_by绑定了所有列的排序逻辑,确保baz和bar的对应关系,不会出现列值不匹配的问题。
内容的提问来源于stack exchange,提问作者TomNorway
相关产品推荐
相关产品推荐

