Skip to main content
 首页 » 编程设计

python之将条件 if/else 逻辑与 pandas 数据框列一起使用

2025年05月04日22findumars

我的名为 pw2 的数据框看起来像这样,其中有两列 pw1 和 pw2,它们是获胜的概率。我想执行一些条件逻辑,根据 pw1 和 pw2 创建另一个名为 WINNER 的列。

+-------------------------+-------------+-----------+-------------+ 
|          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) 

请您参考如下方法:

不要使用apply,它很慢。使用 np.where

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

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


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

因此,最好使用 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。