Проверьте, существует ли значение в столбце в другом столбце, если да, скопируйте значение из другого столбца в новый столбец

#python #pandas #numpy #conditional-statements

Вопрос:

У меня есть csv-файл со столбцами [Идентификатор] [Номер 1] [Номер 2]

Теперь я хотел бы проверить, существует ли [Number1] в [Number2], и если да, я хочу скопировать значение [ID] в новый столбец [ID2]. Я пробовал с np.где [Number1] == [Number2], однако это не тот результат, который я хочу, так как это проверка значений строк по строкам. Я хочу, чтобы скрипт проверил, существует ли значение [Number1] во всей полноте [Number2].

Так что это похоже на какой-то цикл for, в котором строка 1 [Номер 1] зацикливается до тех пор, пока не будет завершена вся колонка [Номер 2], а затем она переходит к следующей строке. Это означает, что если строка 1 [Номер 1] равна 50131, а строка 5555 [Номер 2] равна 50131, то я хочу, чтобы [идентификатор] из строки 1 был скопирован в строку 5555 как [идентификатор 2].

Если значение не существует, я хотел бы напечатать строку «Нет совпадения» в строке.

Ввод:

ID Число 1 Число 2
9991 123 678
9992 321 321
9993 543 123
9994 678 543
9995 921 001

Ожидаемый результат: (при сравнении числа 1 с числом 2)

ID Число 1 Число 2 ID2
9991 123 678 9994
9992 321 321 9992
9993 543 123 9991
9994 678 543 9993
9995 921 001 «НЕТ СОВПАДЕНИЯ»

Ответ №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])  

с помощью расширенной индексации вы можете изменить порядок для идентификатора 2:

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

Комментарии:

1. Спасибо за решение , это то, к чему я стремлюсь, однако — извините меня за новичка, но как бы это было переведено, если бы данные на самом деле были в одном кадре данных? Я понял, что забыл указать на это в своем вопросе. Когда я пытаюсь выполнить репликацию: df[‘ID2’] = np.где(df[‘Number1’][Нет,:]==df[‘Number2’][:,Нет])[1] Я получаю ошибку: Длина значений (125) не соответствует длине индекса (200)

2. как бы вы сделали так, чтобы, если бы совпадения не было, значение этой строки стало бы строкой с надписью «Совпадения нет»?

3. @qnt13 Проблема в предыдущем ответе была связана со строкой , которую вы упомянули. Я изменил ответ, чтобы учесть это. проверьте это и дайте мне знать, если есть какие-либо ошибки.