我尝试做一个IF语句,它保持我的货币对按字母顺序排列(即USD / EUR会翻转到EUR / USD,因为E按字母顺序排在U之前,但CHF / JPY会保持不变,因为C按字母顺序排列在J.之前我最初会编写特定于此的代码,但意识到还有其他需要翻转的字段(主要是将符号改为正数,反之亦然。反之亦然。)
所以我所做的是编写一个函数来创建一个新的列,并创建一个布尔标识符来确定该字段是否需要操作(True)或不是(False)。
def flipFx(ccypair):
first = ccypair[:3]
last = ccypair[-3:]
if(first > last):
return True
else:
return False
brsPosFwd['Flip?'] = brsPosFwd['Currency Pair'].apply(flipFx)
这很有效,可以做我想要的。
然后我尝试编写一个IF语句来使用该字段创建两个新列:
if brsPosFwd['Flip?'] is True:
brsPosFwd['CurrencyFlip'] = brsPosFwd['Sec Desc'].apply(lambda x:
x.str[-3:]+"/"+x.str[:3])
brsPosFwd['NotionalFlip'] = -brsPosFwd['Current Face']
else:
brsPosFwd['CurrencyFlip'] = brsPosFwd['Sec Desc']
brsPosFwd['NotionalFlip'] = brsPosFwd['Current Face']
但是,这不能正常工作。它创建了两个新字段CurrencyFlip和NotionalFlip,但是对每条记录进行处理都是假的,只是粘贴了它之前的内容。
有没有人有任何想法?
答案 0 :(得分:5)
Pandas使用矢量化函数。您正在对整个系列对象执行操作,就像它们是单个元素一样。
您可以使用numpy.where
来计算您的计算:
import numpy as np
brsPosFwd['CurrencyFlip'] = np.where(brsPosFwd['Flip?'],
brsPosFwd['Sec Desc'].str[-3:]+'/'+brsPosFwd['Sec Desc'].str[:3]),
brsPosFwd['Sec Desc'])
brsPosFwd['NotionalFlip'] = np.where(brsPosFwd['Flip?'],
-brsPosFwd['Current Face'],
brsPosFwd['Current Face'])
另请注意,pd.Series.apply
应作为最后的手段;因为它是一个薄薄的低效循环。在这里,您只需使用.str
访问者。