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

时间:2018-04-10 13:15:34

标签: python pandas if-statement dataframe boolean

我尝试做一个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,但是对每条记录进行处理都是假的,只是粘贴了它之前的内容。

有没有人有任何想法?

1 个答案:

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