#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 Проблема в предыдущем ответе была связана со строкой , которую вы упомянули. Я изменил ответ, чтобы учесть это. проверьте это и дайте мне знать, если есть какие-либо ошибки.