использование df.apply для вызова функции связывания с другим столбцом - PullRequest
0 голосов
/ 08 октября 2018

Учитывая pd.DataFrame как:

    to_remove        pred_0         ....  pred_10
0   ['apple']       ['apple','abc'] ....  ['apple','orange']    
1   ['cd','sister'] ['uncle','cd']  ....  ['apple']

В каждой строке я хочу удалить элемент в pred_0 ... pred_10, если этот элемент отображается в to_remove вта же строка.

В этом примере ответ должен быть следующим:

    to_remove        pred_0 ....  pred_10
0   ['apple']        ['abc']....  ['orange']    # remove 'apple' this row
1   ['cd','sister']  ['uncle']....['apple']     # remove 'cd' and 'sister' this row

Мне интересно, как связать код для этого.

Чтобы создать пример df:

from collections import OrderedDict
D=pd.DataFrame(OrderedDict({'to_remove':[['apple'],['cd','sister']],'pred_0':[['apple','abc'],['uncle','cd']],'pred_1':[['apple','orange'],['apple']]}))

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Вы можете использовать пару списочных пониманий:

s = df['to_remove'].map(set)

for col in ['pred_0', 'pred_1']:
    df[col] = [[i for i in L if i not in S] for L, S in zip(df[col], s)]

print(df)

      to_remove   pred_0    pred_1
0       [apple]    [abc]  [orange]
1  [cd, sister]  [uncle]   [apple]

Скорее всего, списочные понимания будут более эффективными, чем pd.DataFrame.apply, что требует дорогостоящей конструкции и передачи серии вфункция для каждой строки.Как вы можете видеть, для вашего требования не существует реального использования Pandas / NumPy.

Таким образом, если вы не можете позволить себе расширять свои списки в серии строк, dict + list может быть болееправильный выбор структуры данных.

0 голосов
/ 08 октября 2018

Можно попробовать выполнить итерацию каждой строки за строкой и отфильтровать элементы, которые не указаны в этом столбце

Рассмотренный кадр данных

        pred_0      pred_10       to_remove
0   [apple, abc]    [apple, orage]  [apple]
1   [uncle, cd]      [apple]        [cd, sister]

df.apply(lambda x: x[x.index.difference(['to_remove'])].apply(lambda y: [i for i in y if i not in x['to_remove']]),1)

Out:

    pred_0  pred_10
0   [abc]   [orage]
1   [uncle] [apple]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...