检查一列中的值是不是存在于另一列中,如果存在,则将另一列中的值复制到新列中
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
ID
s 其中 Number2
匹配,然后将这些 ID
s 与 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 有关。我已经修改了答案以考虑这一点。检查一下,如果有任何错误,请告诉我。以上是关于检查一列中的值是不是存在于另一列中,如果存在,则将另一列中的值复制到新列中的主要内容,如果未能解决你的问题,请参考以下文章