Не используйте apply
, что очень медленно.Используйте np.where
pw2 = df.pw2.fillna(-np.inf)
df['winner'] = np.where(df.pw1 > pw2, df.Name1, df.Name2)
Как только NaN
s всегда проигрывает, можете просто 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
.