如何在Pandas中找出数值相同的多个最小值或最大值?
解决多球队黄牌数同值时的最值提取问题
这个问题我之前也碰到过!用直接计算最值+布尔筛选的方案是最简洁高效的,既能一次性找出所有数值相同的最值球队,又避免了nlargest的冗余操作,对大型数据集的处理速度也更快。
方案1:Pandas 数据集场景(最常用)
假设你的数据是一个包含Team(球队)和Yellow_Cards(黄牌数)列的DataFrame,步骤如下:
- 计算黄牌数的最小/最大值
- 用布尔索引筛选出所有等于该值的球队
import pandas as pd # 示例数据集 data = { 'Team': ['Denmark', 'Germany', 'France', 'Spain', 'Italy'], 'Yellow_Cards': [4, 4, 2, 6, 2] } df = pd.DataFrame(data) # 提取黄牌最少的球队 min_yellow = df['Yellow_Cards'].min() min_teams = df[df['Yellow_Cards'] == min_yellow]['Team'].tolist() # 提取黄牌最多的球队 max_yellow = df['Yellow_Cards'].max() max_teams = df[df['Yellow_Cards'] == max_yellow]['Team'].tolist() # 格式化输出结果 print(f"黄牌最少的球队({min_yellow}张):{', '.join(min_teams)}") print(f"黄牌最多的球队({max_yellow}张):{', '.join(max_teams)}")
输出结果:
黄牌最少的球队(2张):France, Italy
黄牌最多的球队(6张):Spain
如果丹麦和德国都是4张黄牌(同为最值),只要修改示例数据里的对应数值,就能自动输出黄牌最多的球队(4张):Denmark, Germany。
为什么这个方案比nlargest好?
- 效率更高:
min()/max()只需要一次遍历数据集,布尔筛选也是O(n)时间复杂度,而nlargest需要排序(O(n log k)),大型数据集下性能差距会很明显 - 无需预设数量:不用纠结
nlargest里的k值设多少,不管有多少个球队同最值,都能一次性全部提取 - 代码更简洁:核心逻辑只用4行就搞定,比
nlargest还要额外处理重复值的写法清爽很多
方案2:普通列表/字典场景(无Pandas时)
如果你的数据是普通列表或字典,思路完全一致:先找最值,再筛选对应球队。
# 示例列表数据(球队,黄牌数) teams_data = [('Denmark', 4), ('Germany', 4), ('France', 2), ('Spain', 6), ('Italy', 2)] # 提取所有黄牌数,计算最值 yellow_counts = [count for team, count in teams_data] min_yellow = min(yellow_counts) max_yellow = max(yellow_counts) # 筛选对应球队 min_teams = [team for team, count in teams_data if count == min_yellow] max_teams = [team for team, count in teams_data if count == max_yellow] # 输出结果 print(f"黄牌最少的球队:{min_teams}({min_yellow}张)") print(f"黄牌最多的球队:{max_teams}({max_yellow}张)")
这个写法同样高效,不管数据量多大,都是线性遍历,不会有性能瓶颈。
内容的提问来源于stack exchange,提问作者yssefunc
相关产品推荐
相关产品推荐

