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

Pandas逐行判断一组多列与另一组多列是否存在相等值的方法

以下两种无循环的实现方式都可以满足需求,性能远高于手动逐行遍历:

方法1:简洁易读版(适合中小数据量)

逻辑直观易懂,代码维护成本低:

import pandas as pd

# 示例数据
mydf = pd.DataFrame({'a1': [1, 2, 3, 4, 5], 'a2': [6, 7, 8, 9, 10], 'a3': [2, 3, 4, 5, 6], 'b1': [1, 7, 2, 3, 4], 'b2': [8, 9, 4, 2, 2], 'b3': [1, 3, 3, 3, 5]})

# 筛选a、b开头的列
a_cols = mydf.filter(regex=r'^a').columns
b_cols = mydf.filter(regex=r'^b').columns

# 逐行判断两类列的取值集合是否有交集
mydf['x'] = mydf.apply(lambda row: 1 if set(row[a_cols]) & set(row[b_cols]) else 0, axis=1)

方法2:高性能向量化版(适合十万行以上大表)

基于Numpy广播实现,完全不需要逐行遍历,性能比apply版高1~2个数量级:

import pandas as pd
import numpy as np

mydf = pd.DataFrame({'a1': [1, 2, 3, 4, 5], 'a2': [6, 7, 8, 9, 10], 'a3': [2, 3, 4, 5, 6], 'b1': [1, 7, 2, 3, 4], 'b2': [8, 9, 4, 2, 2], 'b3': [1, 3, 3, 3, 5]})

a_vals = mydf.filter(regex=r'^a').values
b_vals = mydf.filter(regex=r'^b').values

# 广播比较所有a、b列的值,逐行判断是否存在相等值
mydf['x'] = (a_vals[:, :, None] == b_vals[:, None, :]).any(axis=(1,2)).astype(int)

两种方法运行后得到的x列和你给出的预期结果完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:15:03