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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 17:54:03