2017-01-31 24 views
3

我想使用lambda和map在我的數據框中創建一個新列。基本上,如果滿足條件,並且列B不符合標準,則新列將取A列。請參閱下面的代碼。使用Lambda和條件連接

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

然而,當我做到這一點的函數返回到每個項目的整列在我的新列。

英語我正在閱讀Long列中的每個項目y。如果該項目> 0,則在「貨幣」列中取第y個值。否則,請在「開始」列中輸入第y個值。

迭代運行速度極慢。還有其他選擇嗎?

謝謝! 詹姆斯

+0

'DF [...]'是一個語法錯誤。你確定這正是你正在運行的代碼嗎? – 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) 

這是很好的做法向量。

df.Long.map適用於每一行,但實際返回df.Statedf.current這是系列。

的另一種方法是考慮:

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

還將與df.columns=Index(['Long', 'Currency', 'StartDate', ...])

工作,但它不是一個量化的方法,所以它是緩慢的。 (在這種情況下1000行較慢200倍)。

0

你可以使用where一樣的:

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