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

如何为包含多列数值的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:09:02