如何用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)
方案解释
- 统一配对键:通过对
x和y排序后拼接,让互为逆配对的行拥有相同的分组键,实现逆配对的分组聚合 - 向量化取最大值:用
transform方法将每组的最高分批量映射到每一行,全程无循环,效率拉满 - 布尔判断:直接比较当前行分数与组内最高分,完美匹配需求——分数相等时均为True,分数更高的为True,更低的为False
内容的提问来源于stack exchange,提问作者CodeTrek
相关产品推荐
相关产品推荐

