Pandas groupby迭代时如何按指定排序规则输出分组结果
问题原因
pandas 的 groupby 默认参数是 sort=True,分组时会自动对分组键的组合做升序排列,这个逻辑和分组前原DataFrame的行排序没有关系。你现在传入的分组键是['col1', 'is_open'],默认排序会优先按col1的字典序升序排,col1='a'的分组自然排在col1='b'前面,所以哪怕你提前把is_open=1的行挪到最前面,分组输出还是会先出a对应的分组。
解决方法
方案1:关闭groupby自动排序,复用提前写好的排序逻辑
你之前先按is_open降序排序DataFrame的思路完全没问题,只要在调用groupby时加上sort=False,关掉默认的分组自动重排逻辑,就会按照原数据里各分组第一次出现的顺序输出:
import pandas as pd df = pd.DataFrame([{'col1':'a', 'is_open':0}, {'col1':'b', 'is_open':1}]) df = df.sort_values('is_open', ascending=False).reset_index(drop=True) # 加sort=False关闭分组自动排序 for i, d in df.groupby(['col1', 'is_open'], sort=False): print(d)
运行输出和预期完全一致:
col1 is_open 0 b 1 col1 is_open 1 a 0
方案2:调整分组键优先级自定义排序
如果你需要明确控制每个分组键的排序方向,也可以把优先级更高的is_open放到分组键列表的第一位,通过ascending参数指定排序方向:
# is_open作为第一排序键降序,col1作为第二键升序 for i, d in df.groupby(['is_open', 'col1'], ascending=[False, True]): print(d)
注意:这个方法返回的分组键元组顺序是(is_open取值, col1取值),如果你的后续代码依赖原来的分组键返回顺序,优先用方案1。
内容的提问来源于stack exchange,提问作者tompal18
相关产品推荐
相关产品推荐

