pandas.DataFrame.idxmax如何识别列方向并列最大值
棒球赛事并列最高得分局次识别实现方案
核心实现逻辑
原有idxmax方法仅返回逐行首次出现的最大值索引,无法覆盖并列场景,需调整为三步判断逻辑:
- 逐行计算单场比赛所有局次的得分最大值
- 逐行匹配所有得分等于该最大值的局次
- 根据匹配到的局次数量分支处理:仅匹配到1个时正常返回局次名;匹配到2个及以上时,添加专属并列标识,拼接所有并列的局次信息
基础可运行代码
首先定义固定的局次列集合,避免重复书写列名:
# 定义所有局次的得分列名列表 inning_cols = ['1ITotRuns','2ITotRuns','3ITotRuns','4ITotRuns','5ITotRuns','6ITotRuns','7ITotRuns','8ITotRuns','9ITotRuns','XITotRuns'] # 提取局次得分子表 inning_runs = sbr[inning_cols]
应用逐行判断逻辑生成新字段:
def parse_max_inning(row): # 筛选当前行得分等于全场最大值的局次 max_inning_list = row.index[row == row.max()].tolist() # 存在并列时添加专属标记 if len(max_inning_list) > 1: return f"[并列最高] {' & '.join(max_inning_list)}" # 无并列时返回唯一的最高局次 return max_inning_list[0] # 逐行计算结果 df['maxInningsRuns'] = inning_runs.apply(parse_max_inning, axis=1)
大数据量优化方案
逐行apply在万行以上规模的数据集上运行效率偏低,可换为向量化运算提速:
# 1. 逐行计算单场最高得分阈值 row_max_val = inning_runs.max(axis=1) # 2. 生成匹配掩码:标记每个局次是否等于行最高值 match_mask = inning_runs.eq(row_max_val, axis=0) # 3. 统计每行匹配到的最高局次数量 match_inning_count = match_mask.sum(axis=1) # 4. 拼接每行匹配到的局次名称 matched_inning_str = match_mask.apply(lambda col: ' & '.join(col.index[col]), axis=1) # 5. 生成最终结果:非并列场景直接返回局次名,并列场景添加专属前缀 df['maxInningsRuns'] = matched_inning_str.where( match_inning_count == 1, "[并列最高] " + matched_inning_str )
输出效果参考
- 无并列场景:某场比赛仅3局得分最高,输出为
3ITotRuns- 并列场景:某场比赛2局、5局得分同为全场最高,输出为
[并列最高] 2ITotRuns & 5ITotRuns
自定义调整说明
- 可根据业务需求修改并列标记格式:如果不需要保留具体并列的局次名称,仅需要识别并列状态,可直接将并列场景的返回值替换为固定标识(比如字符串“并列”、特殊数值-1)
- 也可以按照实际需要调整并列文本的拼接分隔符,替换默认的
&为其他符号
内容的提问来源于stack exchange,提问作者Marc Blair
相关产品推荐
相关产品推荐

