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

Posted

技术标签:

【中文标题】检查一列中的值是不是存在于另一列中,如果存在,则将另一列中的值复制到新列中【英文标题】:Check if a value in a column exists in another column, if so, copy value from another column into a new column检查一列中的值是否存在于另一列中,如果存在,则将另一列中的值复制到新列中 【发布时间】:2021-12-29 11:57:00 【问题描述】:

我有一个包含 [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'

【问题讨论】:

【参考方案1】:

您可以通过两次合并获得所需的结果。一次获得 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')
)

【讨论】:

【参考方案2】:

假设以下数组:

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']

【讨论】:

感谢您的解决方案,这是我的目标,但是 - 请原谅我的初学者,但是如果数据实际上位于单个数据帧中,这将如何转换?我意识到我忘了在我的问题中指出这一点。当我试图通过这样做进行复制时: df['ID2'] = np.where(df['Number1'][None,:]==df['Number2'][:,None])[1] 我得到一个错误:值的长度(125)与索引的长度(200)不匹配 你将如何做到这一点,如果没有匹配,那么该行值将变成一个字符串,说“不匹配”? @qnt13 较早的答案中的问题与您提到的 string 有关。我已经修改了答案以考虑这一点。检查一下,如果有任何错误,请告诉我。

以上是关于检查一列中的值是不是存在于另一列中,如果存在,则将另一列中的值复制到新列中的主要内容,如果未能解决你的问题,请参考以下文章

如果来自一列的数据存在于另一列中,则合并两个数据框

如果一列中存在数字,则在另一列中查找与该数字相对应的值

检查每组的另一列中是不是存在列值

根据另一列中的值从一列中减去值(SQL)

如果另一列中的行包含列表中的项目,则计算一列中的值的总和

excel中如何检查一列中的内容是不是包含在另一个文档的一列中。