对熊猫数据框列使用条件if / else逻辑

时间:2018-09-22 14:33:51

标签: python pandas dataframe if-statement

我的数据帧pw2看起来像这样,我有两列pw1和pw2,这是获胜的概率。我想执行一些条件逻辑,根据WINNERpw1创建另一个称为pw2的列。

+-------------------------+-------------+-----------+-------------+
|          Name1          |     pw1     |   Name2   |     pw2     |
+-------------------------+-------------+-----------+-------------+
| Seaking                 | 0.517184213 | Lickitung | 0.189236181 |
| Ferrothorn              | 0.172510623 | Quagsire  | 0.260884258 |
| Thundurus Therian Forme | 0.772536272 | Hitmonlee | 0.694069408 |
| Flaaffy                 | 0.28681284  | NaN       | NaN         |
+-------------------------+-------------+-----------+-------------+

我想有条件地在函数中执行此操作,但是遇到了一些麻烦。

  • 如果pw1> pw2,则用Name1填充
  • 如果pw2> pw1,则用Name2填充
  • 如果已填充pw1但未填充pw2,请填充Name1
  • 如果已填充pw2但未填充pw1,请填充Name2

但是我的函数无法正常工作-出于某种原因检查值是否为null无法正常工作。

def final_winner(df):
    # If PW1 is missing and PW2 is populated, Pokemon 1 wins
    if df['pw1'] = None and df['pw2'] != None:
        return df['Number1']
    # If it's the same thing but the other way around, Pokemon 2 wins
    elif df['pw2'] = None and df['pw1'] != None:
        return df['Number2']
    # If pw2 is greater than pw1, then Pokemon 2 wins
    elif df['pw2'] > df['pw1']:
        return df['Number2']
    else
        return df['Number1']

pw2['Winner'] = pw2.apply(final_winner, axis=1)

1 个答案:

答案 0 :(得分:4)

请勿使用apply,这非常慢。使用np.where

pw2 = df.pw2.fillna(-np.inf)
df['winner'] = np.where(df.pw1 > pw2, df.Name1, df.Name2)

一旦NaN总是失败,可以用fillna() -np.inf来产生相同的逻辑。


查看您的代码,我们可以指出几个问题。首先,您正在比较df['pw1'] = None,这是无效的python语法,无法进行比较。您通常希望使用==运算符比较事物。但是,对于None,建议使用is,例如if variable is None: (...)。但是,同样,您处于pandas/numpy环境中,其中实际上有多个空值(NoneNaNNaT等)。

因此,最好使用pd.isnull()df.isnull()检查可为空性。

仅说明一下,这就是您的代码的外观:

def final_winner(df):
    if pd.isnull(df['pw1']) and not pd.isnull(df['pw2']):
        return df['Name1']
    elif pd.isnull(df['pw2']) and not pd.isnull(df['pw1']):
        return df['Name1']
    elif df['pw2'] > df['pw1']:
        return df['Name2']
    else:
        return df['Name1']

df['winner'] = df.apply(final_winner, axis=1)

但是同样,绝对要使用np.where