我的数据帧pw2
看起来像这样,我有两列pw1和pw2,这是获胜的概率。我想执行一些条件逻辑,根据WINNER
和pw1
创建另一个称为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)
答案 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
环境中,其中实际上有多个空值(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
。