大熊猫DataFrame中的条件操作

时间:2019-12-11 13:03:04

标签: python pandas dataframe logic

我有一个熊猫数据框,我想根据另一列中的值设置一列中的值。有6种可能的情况,因此一个if / else无法正常工作。我无法将If / else的组合用于SBT> = x和<= y的情况。 以下是我试图在Python中重新创建的Excel VBA代码中的迭代宏的内容。它向下移动每一行进行检查。我知道它在Python中会更加高效。

If SBT > 3.6 Then
ActiveCell.Offset(0, -1) = "2"
ElseIf SBT >= 2.95 And SBT <= 3.6 Then
ActiveCell.Offset(0, -1) = "3"
ElseIf SBT >= 2.6 And SBT <= 2.95 Then
ActiveCell.Offset(0, -1) = "4"
ElseIf SBT >= 2.05 And SBT <= 2.6 Then
ActiveCell.Offset(0, -1) = "5"
ElseIf SBT >= 1.31 And SBT <= 2.05 Then
ActiveCell.Offset(0, -1) = "6"
ElseIf SBT < 1.31 Then
ActiveCell.Offset(0, -1) = "7"
Else
End If

我看过

np.where(a < 4, -1, 100)

df['desired_output'] = df['data'].apply(lambda x: 'true' if x <= 2.5 else 'false')

这些可行的选择之一吗?我该如何嵌套语句(尤其是“这些值之间”的部分),还是有另一种更有效的方法呢? 以下数据(SBT)和预期结果(SBTno)的摘要。

SBT   SBTn
7.00    2
1.28    7
3.64    2
2.97    3
2.83    4

3 个答案:

答案 0 :(得分:4)

这是从cut

出发的一种方法
s=pd.cut(df.SBT,bins=[0,1.31,2.05,2.6,2.95,3.6,np.Inf],labels=[7,6,5,4,3,2])
0    2
1    7
2    2
3    3
4    4
df['SBTn']=s.astype(str)

答案 1 :(得分:2)

另一种选择是在函数中编写逻辑并使用apply

def create_desired_output(SBT):
    if SBT > 3.6:
        return 2
    if SBT >= 2.95 and SBT <= 3.6:
        return 3
    if SBT >= 2.6 and SBT <= 2.95:
        return 4
    if SBT >= 2.05 and SBT <= 2.6:
        return 5
    if SBT >= 1.31 and SBT <= 2.05:
        return 6
    if SBT < 1.31:
        return 7
    return ''
df['desired_output'] = df['SBT'].apply(lambda x: create_desired_output(x))
df

答案 2 :(得分:1)

通过使用python for循环,尝试使用不违反pandas核心功能的设置:

使用numpy:

import numpy as np
col         = 'SBT'
conditions  = [ df[col] > 3.4, (df[col] > 2.95) & (df[col] <= 3.6)] 
choices     = [ 2, 3]
df2["desired_output"] = np.select(conditions, choices, default=np.nan) 
# adding NaN for anything that doesn't meet the condition
条件有您的逻辑输入,想象一下编写没有输出的if,else语句。

然后,选择是按照与您的条件相同的顺序满足这些条件的输出。

然后可以使用np.select初始化数据框上的逻辑。

如果您的实际逻辑与示例输入匹配,则最好使用@YO和BEN_W答案,如果您有if/else类型的逻辑,请尝试上述操作。

如果您想嵌套np.where

您可以做这样的事情,所以会很长,所以我只建议在较短的条件下使用。

np.where(x > 1, -1,
                  (np.where(x < 1, 0,
                                     (np.where(x...