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

如何在Pandas DataFrame中提取匹配两列表交叉组合的行?

提取符合跨列表交叉组合的DataFrame行

问题背景

现有两个列表:

List1:
123 
456 
789 

List2:
321
654
987

需要生成跨列表的双向交叉组合(即List1元素与List2元素的所有有序配对,包含A来自List1+B来自List2,以及A来自List2+B来自List1的情况,排除同一列表内元素的组合),最终组合如下:

123-321
123-654
123-987
456-321
456-654
456-987
789-321
789-654
789-987
321-123
321-456
321-789
654-123
654-456
654-789
987-123
987-456
987-789

需要用这些组合匹配Pandas DataFrame的A、B两列,提取匹配成功的行。

示例输入DataFrame:

A   B   Value
123 321 0.5
456 111 0.4
987 654 0.3

期望输出:

A   B   Value
123 321 0.5

实现步骤

1. 生成合法的交叉组合元组集合

先定义原始列表,再生成所有跨列表的有序配对:

import pandas as pd

# 定义原始列表
list1 = [123, 456, 789]
list2 = [321, 654, 987]

# 生成所有跨列表的有序组合:包含list1→list2和list2→list1的双向配对
valid_pairs = []
# 添加list1元素在前的组合
for x in list1:
    for y in list2:
        valid_pairs.append((x, y))
# 添加list2元素在前的组合
for x in list2:
    for y in list1:
        valid_pairs.append((x, y))
# 转换成集合,提升后续匹配效率
valid_pairs_set = set(valid_pairs)

2. 匹配DataFrame并过滤行

将DataFrame每行的A、B列转换成元组,检查是否存在于合法组合集合中:

# 构建示例输入DataFrame
df = pd.DataFrame({
    'A': [123, 456, 987],
    'B': [321, 111, 654],
    'Value': [0.5, 0.4, 0.3]
})

# 筛选符合条件的行
result = df[df.apply(lambda row: (row['A'], row['B']) in valid_pairs_set, axis=1)]

# 输出结果
print(result)

执行后得到的结果:

A    B  Value
0  123  321    0.5

大数据量优化

如果DataFrame数据量较大,apply方法效率偏低,可以用zip批量生成元组序列,再用isin方法提速:

# 批量生成A、B列的元组序列
df_pairs = list(zip(df['A'], df['B']))
# 筛选匹配的行
result = df[pd.Series(df_pairs).isin(valid_pairs_set)]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:47:24