如何用transform替代merge与临时列实现Pandas特殊索引排名?
优化方案:用transform直接生成目标rank列
可以通过groupby.transform方法直接完成计算,完全避免临时列和merge操作,代码更简洁高效:
import pandas as pd import io data = ''' category,sub_cat A,a A,c A,d B,c B,d D,a D,b D,c G,b G,c G,e G,f G,h ''' df = pd.read_csv(io.StringIO(data), sep=',') # 核心逻辑:分组计算相对位置 df['rank'] = df.groupby('category').transform( lambda group: group.cumcount() - group[group['sub_cat'] == 'c'].cumcount().iloc[0] ) print(df)
关键逻辑说明
group.cumcount():生成每组内从0开始的行位置索引,替代原代码的cat_index临时列。group[group['sub_cat'] == 'c'].cumcount().iloc[0]:定位每组中sub_cat='c'行的组内位置,替代原代码的c_idx临时列。transform方法会将每组的计算结果广播回原DataFrame的对应行,自动完成组间重置,无需额外的merge操作。
输出结果
运行后直接得到包含rank列的目标DataFrame,没有任何临时列:
category sub_cat rank 0 A a -1 1 A c 0 2 A d 1 3 B c 0 4 B d 1 5 D a -2 6 D b -1 7 D c 0 8 G b -1 9 G c 0 10 G e 1 11 G f 2 12 G h 3
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

