比较同一数据帧中的两列,发现第一列中的哪一行与第二行中的哪行匹配



我一直在尝试如何比较两列,这两列之间共享一些值,但位于不同的行。

例如

col_index col_1 col_2
1 12 34
2 16 42
3 58 35
4 99 60
5 2 12
12 35 99

IIUC只有第2行应从col_index中删除。

您可以使用np.intersect1d查找两列之间的公共值,然后使用isin:检查这些值是否在您的列中

import numpy as np
common_values = np.intersect1d(df.col_1,df.col_2)
res = df[(df.col_1.isin(common_values))|(df.col_2.isin(common_values))]

res
col_index  col_1  col_2
0          1     12     34 # 12
2          3     58     35 # 35 
3          4     99     60 # 99
4          5      2     12 # 12
5         12     35     99 # 99
res[['col_index']]
col_index
0          1
2          3
3          4
4          5
5         12

您可以使用isin方法来获取掩码,然后使用它来过滤匹配项。最后,您得到了col_idex列,仅此而已。因此,使用您的数据帧:

mask = df.col_1.isin(df.col_2)
print(df[mask].col_index.to_list()) #to_list is only to get a python list from a Serie.

结果:[1, 4, 12]

使用Series.isin方法简单地循环两列中的值

# test data:
a = 12,16,58,99
b = 34,99,35,12
c = 1,2,3,5
d = pd.DataFrame({"col_1":a, "col_2":b, 'col_idx':c})
#   col_1  col_2  col_idx
#0     12     34        1
#1     16     99        2
#2     58     35        3
#3     99     12        5

for _,row in d.loc[d.col_1.isin(d.col_2)].iterrows():
val = row.col_1
idx1 = row.col_idx

print(val, idx1, d.query("col_2==%d" % val).col_idx.values)
#12 1 [5]
#99 5 [2]

如果您的值是字符串(而不是本例中的整数(,请相应地更改query参数:query("col_2=='%s'" % val)

最新更新