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

Pandas分组排名Points时如何保留Gender字符串列(禁止合并DataFrame)

问题解决:分组排名时保留非聚合列

示例数据

import pandas as pd

data = {
    'Name': ['Ada', 'Lily', 'Peter', 'Joe', 'Mark'],
    'Gender': ['F', 'F', 'M', 'M', 'M'],
    'City': ['NewYork', 'London', 'HongKong', 'Tokyo', 'London'],
    'Points': [100, 50, 90, 70, 30]
}
df = pd.DataFrame(data)

问题现象

按Name和City分组后调用agg(rank)对Points列排名,结果丢失了Gender列:

Name      City  Points_rank
0    Ada   NewYork           1.0
1   Lily    London           1.0
2  Peter  HongKong           1.0
3    Joe     Tokyo           1.0
4   Mark    London           2.0

解决方案:使用transform替代agg

agg会返回分组聚合后的精简结果,仅保留分组键和聚合列;而transform会将聚合结果广播回原DataFrame的每一行,因此能保留所有原始列,同时新增排名列,完全符合你不允许合并原DataFrame的要求。

代码示例:

# 按Name和City分组,对Points列计算排名,保留所有原始列
df['Points_rank'] = df.groupby(['Name', 'City'])['Points'].transform(lambda x: x.rank())

执行后得到的完整结果:

Name Gender      City  Points  Points_rank
0    Ada      F   NewYork     100           1.0
1   Lily      F    London      50           1.0
2  Peter      M  HongKong      90           1.0
3    Joe      M     Tokyo      70           1.0
4   Mark      M    London      30           2.0

自定义排名规则补充

如果需要调整排名逻辑(比如降序排名、不同的排名算法),可以在rank()中传入对应参数,例如实现降序排名:

df['Points_rank_desc'] = df.groupby(['Name', 'City'])['Points'].transform(lambda x: x.rank(ascending=False))

内容的提问来源于stack exchange,提问作者Kelvin Yeung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:36:18