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
相关产品推荐
相关产品推荐

