代码之家  ›  专栏  ›  技术社区  ›  tender

基于布尔限定符的Python熊猫if语句

  •  1
  • tender  · 技术社区  · 6 年前

    我正在尝试做一个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,但将每一条记录都视为错误,只是粘贴之前的记录。

    有人有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  5
  •   jpp    6 年前

    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 访问者。