查找在查找表中存在的列值组合

1 投票
1 回答
40 浏览
提问于 2025-04-14 16:29

假设我有两个数据表 d1d2,可以用下面的代码生成。

d1 = pd.DataFrame({'c1':['A', 'B', 'C', 'D', 'E', 'F'],
                            'c2': ['G', 'H', 'I', 'J', 'K', 'L'],
                            'val':[10, 20, 30, 40, 50, 60]})

d2 = pd.DataFrame({'c1':['A', 'B', 'C', 'D', 'E', 'F'],
                     'c2': ['H', 'H', 'I', 'J', 'L', 'K'],
                     'c1_found' : [1, 1, 1, 1, 1, 1],
                     'c2_found' : [1, 1, 1, 1, 1, 1]})

我想创建一个新列 c1_c2_found,这个列的内容是检查 d1 表中是否同时存在 c1c2 的组合。

我可以用下面的代码来实现这个功能。有没有更优化的方法(比如向量化的方法)可以用来解决这个问题呢?

# Check if both 'c1' and 'c2' values in d1 exist in d2
merged_data = pd.merge(d2, d1, on=['c1', 'c2'], how='inner')

d2['c1_c2_found'] = d2.apply(lambda row: 1 if (row['c1'], row['c2']) in zip(merged_data['c1'], merged_data['c2']) else 0, axis=1)

1 个回答

3

如果我理解正确的话,你可以对 d2 进行 左连接 操作:

d2 = d2.merge(d1, on=["c1", "c2"], how="left")
d2["c1_c2_found"] = d2.pop("val").notna().astype(int)
print(d2)

输出结果是:

  c1 c2  c1_found  c2_found  c1_c2_found
0  A  H         1         1            0
1  B  H         1         1            1
2  C  I         1         1            1
3  D  J         1         1            1
4  E  L         1         1            0
5  F  K         1         1            0

撰写回答