Python pandas if语句基于布尔限定符

Ric*_*Ric 1 python if-statement boolean dataframe pandas

我试着做一个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)    
Run Code Online (Sandbox Code Playgroud)

这很好用,做我想要的.

然后我尝试编写一个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']
Run Code Online (Sandbox Code Playgroud)

但是,这不能正常工作.它创建了两个新字段,CurrencyFlip和NotionalFlip,但是对每个记录都是假的,只是粘贴它之前的内容.

有没有人有任何想法?

jpp*_*jpp 5

熊猫使用矢量化函数.您正在对整个系列对象执行操作,就像它们是单个元素一样.

您可以使用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'])
Run Code Online (Sandbox Code Playgroud)

还要注意,pd.Series.apply应该作为最后的手段; 因为它是一个薄薄的低效循环.在这里,您只需使用.str访问者.