我正在尝试做一个IF语句,它将我的货币对按字母顺序排列(即美元/欧元将翻转为欧元/美元,因为按字母顺序,e排在U之前,而瑞士法郎/日元将保持不变,因为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和ConceptalFlip,但将每一条记录都视为错误,只是粘贴之前的记录。
有人有什么想法吗?
Pandas使用矢量化函数。您正在对整个系列对象执行操作,就像它们是单个元素一样。
您可以使用 numpy.where 要将计算矢量化,请执行以下操作:
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 访问者。
pd.Series.apply
.str