【问题标题】:Python pandas if statement based off of boolean qualifierPython pandas if 语句基于布尔限定符
【发布时间】:2018-09-20 03:14:15
【问题描述】:

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

有人有什么想法吗?

【问题讨论】:

    标签: python pandas if-statement dataframe boolean


    【解决方案1】:

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

    【讨论】:

    • 嗨 jpp,这是完美的,谢谢。随着对 Pandas 的熟悉,我将更多地研究 WHERE 函数。欣赏解释。
    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 2020-07-09
    • 2018-09-26
    • 2013-03-26
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    相关资源
    最近更新 更多