Моя pw2
под названием 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 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
всегда проигрывает, он может просто fillna()
его с помощью -np.inf
чтобы получить -np.inf
же логику.
Посмотрев на ваш код, мы можем указать на несколько проблем. Во-первых, вы сравниваете df['pw1'] = None
, что является недопустимым синтаксисом python для сравнения. Обычно вы хотите сравнить вещи, используя ==
оператора. Однако для None
рекомендуется использовать is
, например, if variable is None: (...)
. Однако снова вы находитесь в среде pandas/numpy
, где на самом деле имеется несколько значений для нулевых значений (None
, NaN
, NaT
и т.д.).
Таким образом, лучше проверить значение nullability, используя 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
.