如何按另一列均值排序DataFrame及结合ID唯一值升序排序?
解决按分组均值排序DataFrame的问题
嘿,我来帮你搞定这个需求!你想要的是先按ID分组后Num列的均值对整个DataFrame升序排序,同时每个ID组内再按Num列升序排列,对吧?
你之前用df.sort_values(by=['Num'])只单独按Num列排序,自然不会考虑ID的分组逻辑。下面给你两种可行的实现方式:
方法一:添加辅助列实现排序
这种方式直观易懂,先给原DataFrame加上每个ID对应的Num均值列,再基于这个均值列+Num列排序:
import pandas as pd # 你的原始DataFrame df = pd.DataFrame({'ID': ['a', 'b', 'b', 'a'], 'Num': [3, 4, 2, 1]}) # 计算每个ID的Num均值,添加为新列 df['Num_mean'] = df.groupby('ID')['Num'].transform('mean') # 先按均值升序,再按Num升序排序,最后删除辅助列 df_sorted = df.sort_values(by=['Num_mean', 'Num']).drop('Num_mean', axis=1) print(df_sorted)
输出结果完全符合你的期望:
ID Num 3 a 1 0 a 3 2 b 2 1 b 4
方法二:用key参数直接排序(无需辅助列)
如果你不想添加额外列,可以利用pandas 1.1.0及以上版本支持的key参数,直接定义排序逻辑:
import pandas as pd df = pd.DataFrame({'ID': ['a', 'b', 'b', 'a'], 'Num': [3, 4, 2, 1]}) # 定义排序键:对ID列用分组均值映射,对Num列直接用原值 df_sorted = df.sort_values( by=['ID', 'Num'], key=lambda x: x.map(df.groupby('ID')['Num'].mean()) if x.name == 'ID' else x ) print(df_sorted)
这个方法会先根据每个ID对应的Num均值对ID组排序,再在组内按Num升序排列,输出结果和上面一致。
内容的提问来源于stack exchange,提问作者Mamed
相关产品推荐
相关产品推荐

