2017-01-31 2 views
3

Я пытаюсь использовать лямбда и карту, чтобы создать новый столбец в моей информационной кадре. По существу, новый столбец будет брать столбец А, если будет выполняться критерий, а столбец В - критерии не выполняются. См. Мой код ниже.Конкатенация с использованием лямбда и условий

df['LS'] = df.['Long'].map(lambda y:df.Currency if y>0 else df.StartDate) 

Однако, когда я это делаю, функция возвращает весь столбец каждому элементу в моем новом столбце.

На английском языке Я просматриваю каждый элемент y в столбце Long. Если элемент> 0, тогда возьмите y-значение в столбце «Валюта». В противном случае возьмите y-значение в столбце «Старт».

Итерация чрезвычайно медленна при работе выше. Есть ли другие варианты?

Спасибо! Джеймс

+0

'ДФ [...]' ошибка синтаксиса. Вы уверены, что это именно тот код, который вы используете? – mkrieger1

+1

IIUC вы хотите 'df ['LS'] = df ['Currency']. Где (df ['Long']> 0, df ['StartDate'])' – EdChum

ответ

1

Вобще

df['LS']=np.where(df.Long>0,df.Currency,df.StartDate) 

, который является хорошей Vectored подход.

df.Long.map относится к каждой строке, но фактически возвращается df.State или df.current, которые являются сериями.

Другим подходом является рассмотрение:

df.apply(lambda row : row[1] if row[0]>0 else row[2],1) 

также будет работать с df.columns=Index(['Long', 'Currency', 'StartDate', ...])

но это не векторную подход, так это очень медленный процесс. (200x медленнее для 1000 строк в этом случае).

0

Вы можете сделать то же самое с помощью where:.

df['LS'] = df['Currency'].where(df['Long']>0,df['StartDate']) 
Смежные вопросы