检查一列中的值是否存在于另一列中,如果存在,则将值从另一列复制到新列中

Check if a value in a column exists in another column, if so, copy value from another column into a new column

我有一个包含列 [ID] [Number1] [Number2]

的 csv 文件

现在我想检查 [Number1] 是否存在于 [Number2] 中,如果存在,我想将 [ID] 的值复制到一个新列 [ID2] 中。 我试过 np.where [Number1] == [Number2] 但这不是我想要的输出,因为这是逐行检查值。我想让脚本做的是检查 [Number1] 的值是否存在于整个 [Number2].

有点像某种 for 循环,其中循环 [Number1] 的第 1 行直到整个 [Number2] 列完成,然后移动到下一行。这意味着如果 [Number1] 的第 1 行是 50131,[Number2] 的第 5555 行是 50131,那么我希望将第 1 行的 [ID] 作为 [ID2].

复制到第 5555 行

如果该值不存在,我想在行中打印 'No Match' 字符串。

输入:

ID Number1 Number2
9991 123 678
9992 321 321
9993 543 123
9994 678 543
9995 921 001

预期结果:(比较 Number1 和 Number2 时)

ID Number1 Number2 ID2
9991 123 678 9994
9992 321 321 9992
9993 543 123 9991
9994 678 543 9993
9995 921 001 'NO MATCH'

假设有以下数组:

ID = np.array([9991,9992,9993,9994,9995])
Number1 = np.array([123,321,543,678,921])
Number2 = np.array([678,321,123,543,1])

通过使用高级索引,您可以重新排列 ID2:

filled = np.isin(Number2, Number1)
ID2 = np.full(np.shape(ID), 'No Match')

idx = np.where(Number1[None, :] == Number2[:, None])[1]
ID_arr = ID[idx]

ID2[filled] = ID_arr

这将为 ID2 获得以下结果:

['9994' '9992' '9991' '9993' 'No Match']

您可以通过执行两次合并来获得所需的结果。一旦获得 Number1 IDs,其中 Number2 匹配,然后将这些 IDs 与 Number2 合并以获得所需的结果。

connecting_ids = (df[['ID', 'Number1']]
          .merge(df[['Number2']], 
                 how='inner', 
                 left_on='Number1', 
                 right_on='Number2')
          .drop('Number1', axis=1)
          .rename(columns={'ID': 'ID2'})
)

(df.merge(connecting_ids, 
      how='left', 
      on='Number2')
  .fillna('NO MATCH')
)