如何为包含多列数值的pandas DataFrame生成排名表?
Pandas多列批量生成排名的优化实现
这里提供两种更符合pandas最佳实践的向量化实现方式,比你原有循环写法效率更高、代码更简洁:
场景1:仅保留Name列和排名列(匹配你的预期输出需求)
import pandas as pd # 示例数据修正:原示例Reviews列数值为[100,50,10],和预期输出匹配 df = pd.DataFrame({ "Name":['A', 'B', 'C'], "Sales":[1000, 2000, 5400], "Volume":[100, 200, 500], "Reviews":[100, 50, 10] }) # 批量生成排名表 ranked_df = pd.concat([ df['Name'], df[['Sales', 'Volume', 'Reviews']] .rank(ascending=False, method='min') .astype(int) # 可选:直接转整数排名,避免默认float类型 .add_suffix('_rank') ], axis=1)
该写法是纯向量化操作,没有显式循环,大体积DataFrame下处理效率远高于逐列遍历。rank()可以直接作用于整个DataFrame的所有数值列,add_suffix批量统一添加列后缀,不需要先复制全表再删除多余列,逻辑更清晰。
场景2:需要保留原始数值列
用assign加字典推导式实现,代码更紧凑:
ranked_df = df.assign(**{ f"{col}_rank": df[col].rank(ascending=False, method='min').astype(int) for col in ['Sales', 'Volume', 'Reviews'] })
注意事项
- 你原有代码的
rank()默认按升序排名,要得到预期的降序排名结果,必须添加ascending=False参数 - 可根据业务需求调整
method参数:默认是average(相同值返回平均排名),相同值取最高排名用min,需要连续排名不跳号用dense。
内容的提问来源于stack exchange,提问作者Eamon Suen
相关产品推荐
相关产品推荐

