检查一列中的值是否存在于另一列中,如果存在,则将值从另一列复制到新列中
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
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')
)
我有一个包含列 [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
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')
)