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

如何基于DataFrame多列比较生成新列提取中间评级?

解决方法

首先得明确评级的排序规则,先把字母评级映射成可比较的数值权重,比如按你提供的示例,假设评级从高到低的顺序是 A+ > AA > Aa > B+ > BB > Bb > Fa > Fb > Fc,你可以根据实际规则调整这个映射字典。

接下来用Pandas的apply逐行处理,实现你要的逻辑:

import pandas as pd

# 定义评级权重映射,数值越小评级越高
rating_weights = {
    "A+": 1,
    "AA": 2,
    "Aa": 3,
    "B+": 4,
    "BB": 5,
    "Bb": 6,
    "Fa": 7,
    "Fb": 8,
    "Fc": 9
}

df = pd.DataFrame(
    {"Rating_1": ["A+", "AA", "Aa"],
     "Rating_2": ["B+", "BB", "Bb"],
     "Rating_3": ["Fa", "Fb", "Fc"]}
)

def get_middle_rating(row):
    # 获取三个评级及其权重
    ratings = [row["Rating_1"], row["Rating_2"], row["Rating_3"]]
    weights = [rating_weights[r] for r in ratings]
    unique_weights = list(set(weights))
    
    # 场景1:三个评级均不同
    if len(unique_weights) == 3:
        # 找到中间权重对应的评级
        middle_weight = sorted(unique_weights)[1]
        return ratings[weights.index(middle_weight)]
    # 场景2:三个评级完全相同
    elif len(unique_weights) == 1:
        return row["Rating_1"]
    # 场景3:两个相同、一个不同
    else:
        # 找到权重最大的(对应评级最低)的评级
        min_rating_weight = max(weights)
        return ratings[weights.index(min_rating_weight)]

df["NEW COLUMN"] = df.apply(get_middle_rating, axis=1)

print(df)

代码说明

  • 通过rating_weights把每个评级转换成可排序的数值,方便快速比较评级高低;
  • 自定义函数get_middle_rating逐行处理三个评级:
    • 提取当前行的三个评级及对应权重;
    • 根据唯一权重的数量判断场景,返回对应规则的结果;
  • 用apply将函数应用到每一行,直接在原DataFrame生成新列。

关于是否新建DataFrame

不需要新建筛选后的DataFrame,直接在原DataFrame上用apply处理就足够简洁高效。除非你的数据量达到百万级以上,这时可以考虑向量化操作优化,但常规数据量下,上面的方法完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:20:38