如何基于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
相关产品推荐
相关产品推荐

