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

如何用Pandas高效生成配对与逆配对分数比较的Boolean column

Pandas高效生成配对与逆配对的布尔判断列

原始数据结构

x        y         score    
Cat      Dog       0.1    
Dog      Monkey    0.5     
Fish     Cat       0.2     
Cat      Fish      0.2   
Monkey   Dog       0.4    
Dog      Cat       0.7    

需求说明

新增布尔列bool,规则如下:

  • 对每组配对(x,y)及其逆配对(y,x),若当前配对的score大于逆配对则赋值True,小于则赋值False
  • 若两组分数相等,均赋值True

期望结果:

x        y         score    bool
Cat      Dog       0.1      False   # False because Dog,Cat > Cat,Dog
Dog      Monkey    0.5      True    # True because Dog,Monkey > Monkey, Dog
Fish     Cat       0.2      True    # True because both have the same score
Cat      Fish      0.2      True    # ...
Monkey   Dog       0.4      False
Dog      Cat       0.7      True

注意事项

  • 每个(x,y)配对唯一
  • 每个配对都有且仅有一个逆配对
  • 同一列中可多次出现同一类别
  • score取值范围为0-1

数据构造代码

import pandas as pd

df = pd.DataFrame.from_records(
    zip(
        ["Cat","Dog","Fish","Cat","Monkey","Dog"],
        ["Dog","Monkey","Cat","Fish","Dog","Cat"],
        [0.1,0.5,0.2,0.2,0.4,0.7]
    ),
    columns=["x","y","score"]
)

高效解决方案

针对10万+数据量,采用Pandas向量化操作避免逐行遍历:

# 生成配对统一标识:将(x,y)和(y,x)映射为同一键
df['pair_key'] = df.apply(lambda row: '-'.join(sorted([row['x'], row['y']])), axis=1)

# 按分组映射每组的最大分数到各行
max_score = df.groupby('pair_key')['score'].transform('max')

# 生成布尔列:当前分数等于组内最高分则为True
df['bool'] = df['score'] == max_score

# 可选:删除临时辅助列
df = df.drop('pair_key', axis=1)

方案解释

  1. 统一配对键:通过对x和y排序后拼接,让互为逆配对的行拥有相同的分组键,实现逆配对的分组聚合
  2. 向量化取最大值:用transform方法将每组的最高分批量映射到每一行,全程无循环,效率拉满
  3. 布尔判断:直接比较当前行分数与组内最高分,完美匹配需求——分数相等时均为True,分数更高的为True,更低的为False

内容的提问来源于stack exchange,提问作者CodeTrek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:55:16