我一直在尝试如何比较两列,这两列之间共享一些值,但位于不同的行。
例如
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)
。