применение лямбда-строки на нескольких столбцах панд - PullRequest
0 голосов
/ 28 июня 2018

Я создаю примерный фрейм данных как:

tp=pd.DataFrame({'source':['a','s','f'], 
                                'target':['b','n','m'], 
                                'count':[0,8,4]})

И создание столбца 'col' на основе условия столбца 'target' >> такой же, как источник, если соответствует условие, в противном случае по умолчанию, как показано ниже:

tp['col']=tp.apply(lambda row:row['source'] if row['target'] in ['b','n'] else 'x')

Но это выдает ошибку: KeyError: ('target', 'occurred at index count')

Как я могу заставить его работать без определения функции.

1 Ответ

0 голосов
/ 28 июня 2018

Согласно комментарию @ Zero, вам нужно использовать axis=1, чтобы сообщить Pandas, что вы хотите применить функцию к каждой строке. По умолчанию axis=0.

tp['col'] = tp.apply(lambda row: row['source'] if row['target'] in ['b', 'n'] else 'x',
                     axis=1)

Однако для этой конкретной задачи вы должны использовать векторизованные операции. Например, используя numpy.where:

tp['col'] = np.where(tp['target'].isin(['b', 'n']), tp['source'], 'x')

pd.Series.isin возвращает логический ряд, который сообщает numpy.where, выбрать ли второй или третий аргумент.

...