Использование условной логики if / else со столбцами данных pandas - PullRequest
0 голосов
/ 22 сентября 2018

Мой фрейм данных с именем 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

Но моя функция не работает - по какой-то причине проверка, если значение равно нулю, не работает.

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)

1 Ответ

0 голосов
/ 22 сентября 2018

Не используйте 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...