You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按另一列均值排序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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:56:36