Сравните значения в строке и запишите результат в новый столбец - PullRequest
1 голос
/ 06 июня 2019

Мой набор данных выглядит следующим образом:

Paste_Values AB_IDs AC_IDs    AD_IDs
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-7 AD-2182-5

Мне нужно сравнить все значения в столбце Paste_values со всеми тремя другими значениями в строке.

Например:

AE-1001-4 разделен на две части AE и 1001-4 нам нужно проверить 1001-4, есть другие столбцы или нет

если его нет, нам нужно создать новые столбцы, поставить тот же AE-1001-4

, если 1001-4 совпадает с другими столбцами, мы должны изменить его, не вставив 'AE-1001-5' в новый столбец

После:

Если совпадений нет, мне нужно записать значение Paste_values, как во вновь созданном столбце с именем new_paste_value.

Если в других столбцах этой строки есть совпадение (то же значение), то мне нужно изменить последнюю цифру значения в столбце Paste_values, чтобы все значение не совпадалокак и в любых других целых значениях в строке, и это новое сгенерированное значение должно быть записано в столбец new_paste_value.

Мне нужно сделать это с каждой строкой во фрейме данных.

Так чторезультат должен выглядеть примерно так:

Paste_Values AB_IDs AC_IDs    AD_IDs     new_paste_value
AE-1001-4 AB-1001-0  AC-1001-3 AD-1001-2   AE-1001-4
AE-1964-7 AB-1964-2  AC-1964-7 AD-1964-1   AE-1964-3
AE-2211-1 AB-2211-1  AC-2211-3 AD-2211-2   AE-2211-4
AE-2182-4 AB-2182-6  AC-2182-4 AD-2182-5   AE-2182-1

Как мне это сделать?

1 Ответ

2 голосов
/ 06 июня 2019

Начните с определения функции, которая будет применена к каждой строке вашего 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, удалив эти «другие» столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...