Skip to main content
 首页 » 编程设计

Python pandas if 语句基于 boolean 限定符

2025年05月04日22thcjp

我尝试做一个 IF 语句,它使我的货币对按字母顺序排列(即 USD/EUR 将翻转为 EUR/USD,因为 E 按字母顺序排在 U 之前,但是 CHF/JPY 将保持不变,因为 C 按字母顺序排列在 J.之前)最初我打算编写特定于此的代码,但意识到我需要翻转其他字段(主要是将正号更改为负号,反之亦然。)

所以我所做的是编写一个函数来创建一个新列并创建一个 boolean 标识符来确定该字段是否需要操作 (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,但将每条记录都视为 False 并粘贴之前的内容。

有没有人有什么想法?

请您参考如下方法:

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