Polars中group_by后无需map_groups的组内原生排序方法问询
Polars原生实现分组后组内排序(无需map_groups)
原始实现(使用map_groups)
import polars as pl # Sample data data = { 'Group': ['A', 'A', 'B', 'B', 'C', 'C'], 'Value': [10, 20, 15, 25, 5, 30], 'OtherColumn': [100, 200, 150, 250, 50, 300] } # Create DataFrame df = pl.DataFrame(data) # Group by 'Group' and sort within each group by 'Value' sorted_df = df.group_by('Group').map_groups(lambda group_df: group_df.sort('Value')) # Display the sorted DataFrame print(sorted_df)
原生替代方案(无需map_groups)
可以通过group_by + agg + explode的组合实现完全原生的分组内排序,严格遵循"先分组再组内排序"的逻辑:
import polars as pl data = { 'Group': ['A', 'A', 'B', 'B', 'C', 'C'], 'Value': [10, 20, 15, 25, 5, 30], 'OtherColumn': [100, 200, 150, 250, 50, 300] } df = pl.DataFrame(data) # 先分组,再对每组内的所有列按Value排序,最后展开恢复结构 sorted_df = df.group_by("Group", maintain_order=True).agg( pl.all().sort_by("Value") ).explode(pl.all().exclude("Group")) print(sorted_df)
方案说明
group_by("Group", maintain_order=True):按Group列分组,maintain_order=True保留原始分组的顺序(可根据需求省略)pl.all().sort_by("Value"):对每组内的所有列,以Value列为排序依据进行升序排列,此时每组的每列都会被处理为有序列表explode(pl.all().exclude("Group")):将分组后生成的列表型列展开为单行数据,恢复成与原始DataFrame结构一致的格式
这种方式基于Polars的矢量化操作,性能优于map_groups(后者依赖Python层面的循环处理),同时完全符合"先分组再组内排序"的逻辑,而非全局多列排序。
内容的提问来源于stack exchange,提问作者apostofes
相关产品推荐
相关产品推荐

