如何在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
相关产品推荐
相关产品推荐

