Python pandas if 语句基于 boolean 限定符

标签 python pandas if-statement dataframe boolean

我尝试做一个 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 访问器。

关于Python pandas if 语句基于 boolean 限定符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49754676/

相关文章:

python-3.x - 如何在Python中修复 'Keyerror : 0 # duplicate columns & possible reduce dimensionality'

java - 将队列顶部与数组列表元素进行比较

python - 如何设计一个有很多配置选项的程序?

python - Django 1.7 makemigrations 将表重命名为 None

python - Django 模板语法错误

python - 如何对此进行循环?

python - Pandas 合并数据框

python - DataFrame 到用户定义的格式

mysql - 从 GROUP BY 组中选择具有特定内容的行

excel - 电子表格中的 COUNTIFS,同时忽略单独列中的重复项