Как назначить значение новому столбцу во фрейме данных на основе комбинации нескольких условий для нескольких столбцов - PullRequest
0 голосов
/ 18 марта 2020

У меня есть фрейм данных, как показано ниже

data = {'ID': [1,2,3,4,5],
        'text1':['ab','cd','ef','gh','ij'],
        'text2':['ab','de','fh','hj','ij'],
        'text3':['xy','cd','mn','op','qr'],
        'flag1': ['y', 'n', 'y', 'y', 'n'],
        'flag2': ['y', 'y', 'y', 'n', 'n'],
        'flag3': ['y', 'n', 'y', 'n', 'y']}

frame = pd.DataFrame(data)

Я хочу добавить новый столбец - данные ['unique_text_count'] на основе следующих условий:

  1. если данные ['flag1'] == 'y' или data ['flag2'] == 'y' или data ['flag3'] == 'y' -> Любой флаг должен быть 'y'
  2. При условии, что одно из вышеприведенных условий имеет значение True, если какая-либо строка во фрейме данных имеет любое из значений флага как 'y', то соответствующие значения data ['text1'], data ['text2'] & data ['text3' ] следует проверить наличие уникальных значений
  3. Значение нового столбца - data ['unique_text_count'] будет равно:

    0 - если все значения флага для этой строки равны 'n '

    1 - если любое из значений флага равно' y ', а количество уникальных значений в соответствующих текстовых столбцах, где флаг равен' y ', равно 1

    2 - если любое из значения флага равны 'y', а количество уникальных значений в соответствующих текстовых столбцах, где флаг равен 'y', равно 2

    3 - если любое из значений флага равно 1 и количество уникальных значений в t Соответствующие текстовые столбцы, где флаг равен 'y', равны 3

Окончательный результат для 5 строк:

data ['unique_text_count'] = [2, 1 , 3, 1, 1]

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

1 Ответ

1 голос
/ 18 марта 2020

Попробуйте:

frame['unique_text_count'] = (frame.filter(like='text')
                                   .where((frame.filter(like='flag') == 'y').to_numpy())
                                   .nunique(axis=1))

Вывод:

   ID text1 text2 text3 flag1 flag2 flag3  unique_text_count
0   1    ab    ab    xy     y     y     y                  2
1   2    cd    de    cd     n     y     n                  1
2   3    ef    fh    mn     y     y     y                  3
3   4    gh    hj    op     y     n     n                  1
4   5    ij    ij    qr     n     n     y                  1

Подробности:

Используйте filter для выбора столбцов, которые соответствуют параметру like, затем используйте where с булевой матрицей, созданной из == 'y' для возврата текста и nan для тех, у кого 'n'. Наконец, используйте nunique с axis=1 для подсчета уникальных значений в строке.

...