我的名为 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。
