使用带有pandas dataframe列的条件if / else逻辑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用带有pandas dataframe列的条件if / else逻辑相关的知识,希望对你有一定的参考价值。

我的数据框叫做pw2看起来像这样,我有两列,pw1和pw2,这是胜利的概率。我想执行一些条件逻辑来创建另一个名为WINNER的列,基于pw1pw2

+-------------------------+-------------+-----------+-------------+
|          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)

一旦NaNs总是失败,可以fillna()它与-np.inf产生相同的逻辑。


看看你的代码,我们可以指出几个问题。首先,您要比较df['pw1'] = None,这是无效的python语法进行比较。您通常希望使用==运算符进行比较。但是,对于None,建议使用is,例如if variable is None: (...)。然而,再次,你在pandas/numpy环境中,实际上有几个空值的值(NoneNaNNaT等)。

因此,最好使用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

以上是关于使用带有pandas dataframe列的条件if / else逻辑的主要内容,如果未能解决你的问题,请参考以下文章

带有分类标记的行/列的散点图 Pandas DataFrame

如何创建带有列的 Pandas DataFrame?

Pandas 从剪贴板读取带有日期时间列的 DataFrame

pandas使用组合条件判断数据列的内容筛选符合条件的数据行(selecting rows based on a condition in dataframe)

pandas基于组合逻辑筛选dataframe中两个数据列都满足条件的数据行(两个指定数据列的值都大于零的数据行)

pandas DataFrame数据筛选和切片