【问题标题】:Python/ Pandas If statement inside a function explainedPython/Pandas If 函数内的语句解释
【发布时间】:2021-02-12 16:40:04
【问题描述】:

我有以下示例,但我不明白为什么它不起作用。

import pandas as pd

d = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=d)

def balh(a, b):
    z = a + b
    if z.any() > 1:
        return z + 1
    else:
        return z

df['col3'] = balh(df.col1, df.col2)

输出:

我的预期输出将是 col3 中的 57 而不是 46,因为 46grater 而不是 1 add 1 如果 a + bgrater 而不是 1

【问题讨论】:

    标签: python pandas function if-statement


    【解决方案1】:

    any 方法将评估pandas.Seriespandas.DataFrame 的任何元素是否为True。一个非空整数被评估为True。所以基本上通过if z.any() > 1,您将方法返回的True1 整数进行比较。

    您需要直接调节pandas.Series,它将返回一个boolean pandas.Series,您可以在其中安全地应用any 方法。

    all 方法也是如此。

    def balh(a, b):
        z = a + b
        if (z > 1).any():
            return z + 1
        else:
            return z
    

    【讨论】:

      【解决方案2】:

      正如@arhr 清楚地解释的那样,问题是对z.any() 的错误调用,当z 中至少有一个非零元素时,它会返回True。它产生了一个True > 1,它是一个False 表达式。

      避免 if 语句和自定义函数调用的单行替代方法如下:

      df['col3'] = df.iloc[:, :2].sum(1).transform(lambda x: x + int(x > 1))
      

      这会获取数据框中的前两列,然后将每一行的元素相加,并根据 lambda 函数转换新列。

      iloc 也可以省略,因为数据帧仅用两列 col1col2 进行实例化,因此该行可以重构为:

      df['col3'] = df.sum(1).transform(lambda x: x + int(x > 1))
      

      示例输出:

         col1  col2  col3
      0     1     3     5
      1     2     4     7
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 2020-07-05
        • 2014-03-29
        • 2016-11-28
        • 1970-01-01
        • 1970-01-01
        • 2017-10-28
        相关资源
        最近更新 更多