Pandas行最大值平局处理:按对应val列选择对应类型
解决方案:多列平局时按对应价值列优先级选择类型
方法一:基于权重的快速计算法
这种方法通过给类型得分赋予足够高的权重,让得分优先级高于对应价值,直接用idxmax获取结果,代码简洁高效:
import pandas as pd # 初始化数据集 matrix = [(1, 0.3, 0, 0.7, 30, 0, 50), (2, 0.4, 0.4, 0.3, 20, 50, 30), (3, 0.5, 0.2, 0.3, 30, 20, 30), (4, 0.7, 0, 0.3, 100, 0, 40), (5, 0.2, 0.4, 0.4, 50, 30, 80) ] df = pd.DataFrame(matrix, columns=["id", "terror", "drama", "action", "val_terror", "val_drama", "val_action"]) # 定义目标列 type_cols = ["terror", "drama", "action"] val_cols = ["val_terror", "val_drama", "val_action"] # 设置权重:确保权重值大于val列的最大可能值(这里val最大为100,取100即可) weight = 100 # 计算优先级得分:类型得分*权重 + 对应val值,保证得分优先,平局时val高的胜出 priority_scores = df[type_cols] * weight + df[val_cols].values # 获取每行优先级最高的类型 df['top_type'] = priority_scores.idxmax(axis=1) print(df)
方法二:分组排序法
如果不想依赖权重设定,可以通过构造临时数据结构,按行分组排序后取首位:
import pandas as pd # 初始化数据集(同上) matrix = [(1, 0.3, 0, 0.7, 30, 0, 50), (2, 0.4, 0.4, 0.3, 20, 50, 30), (3, 0.5, 0.2, 0.3, 30, 20, 30), (4, 0.7, 0, 0.3, 100, 0, 40), (5, 0.2, 0.4, 0.4, 50, 30, 80) ] df = pd.DataFrame(matrix, columns=["id", "terror", "drama", "action", "val_terror", "val_drama", "val_action"]) type_cols = ["terror", "drama", "action"] val_cols = ["val_terror", "val_drama", "val_action"] # 构造多层列的临时DataFrame,将每个类型的得分和对应val值关联 temp_df = pd.concat( [df[type_cols], df[val_cols].rename(columns=dict(zip(val_cols, type_cols)))], axis=1, keys=['score', 'val'] ) # 按行分组,先按score降序,再按val降序排序,取第一个类型 df['top_type'] = temp_df.stack(level=0).groupby(level=0).apply( lambda x: x.sort_values(['score', 'val'], ascending=False).index[0] ) print(df)
输出结果
两种方法都会得到符合要求的结果:
id terror drama action val_terror val_drama val_action top_type 0 1 0.3 0.0 0.7 30 0 50 action 1 2 0.4 0.4 0.3 20 50 30 drama 2 3 0.5 0.2 0.3 30 20 30 terror 3 4 0.7 0.0 0.3 100 0 40 terror 4 5 0.2 0.4 0.4 50 30 80 action
内容的提问来源于stack exchange,提问作者Jplavorr
相关产品推荐
相关产品推荐

