Начните с определения функции, которая будет применена к каждой строке вашего DataFrame:
def fn(row):
rr = row.copy()
v1 = rr.pop('Paste_Values') # First value
if not rr.str.contains(f'{v1[3:]}$').any():
return v1 # No match
v1a = v1[3:-1] # Central part of v1
for ch in '1234567890':
if not rr.str.contains(v1a + ch + '$').any():
return v1[:-1] + ch
return '????' # No candidate found
Немного объяснения:
Аргумент row на самом деле является Series , со значениями индекса, взятыми из имен столбцов.
Итак rr.pop ('Paste_Values') удаляет значение first , которое являетсясохраняется в v1 , а rest остается в rr .
Затем v1 [3:] извлекает остаток«of v1 (без« AE- ») и str.contains проверяет каждый элемент из rr , содержит ли он эту строку в конечной позиции.
С этим объяснением остальная часть этой функции должна быть вполне понятна.Если нет, выполните каждую отдельную инструкцию и напечатайте их результаты.
И единственное, что нужно сделать, это применить эту функцию к вашему DataFrame, подставив результат в новый столбец:
df['new_paste_value'] = df.apply(fn, axis=1)
Чтобы запустить тест, я создал следующий DataFrame:
df = pd.DataFrame(data=[
['AE-1001-4', 'AB-1001-0', 'AC-1001-3', 'AD-1001-2'],
['AE-1964-7', 'AB-1964-2', 'AC-1964-7', 'AD-1964-1'],
['AE-2211-1', 'AB-2211-1', 'AC-2211-3', 'AD-2211-2'],
['AE-2182-4', 'AB-2182-6', 'AC-2182-4', 'AD-2182-5']],
columns=['Paste_Values', 'AB_IDs', 'AC_IDs', 'AD_IDs'])
Я не получил ошибки в этих данных.Выполните тест по вышеуказанным данным.Может быть, источник вашей ошибки находится в каком-то другом месте?
Может быть, ваш DataFrame содержит также другие ( float ) столбцы, которые вы не включили в свой вопрос,Если это так, запустите мою функцию для копии вашего DataFrame, удалив эти «другие» столбцы.