【问题标题】:How to write a lambda function that is conditional on two variables (columns) in python如何在python中编写一个以两个变量(列)为条件的lambda函数
【发布时间】:2014-09-07 13:34:15
【问题描述】:

我有一个数据集 df,有两个变量 x 和 y。我想编写一个执行以下操作的函数:

x if x>100 and y

我习惯在 STATA 中进行数据分析,所以我对 pandas 进行数据分析比较陌生。如果有帮助,在 stata 中它看起来像:

替换 x = cond(x>100 & y

换句话说,该函数以 df 中的两列为条件,并将根据条件是否满足而从每一行中的一个变量或另一个变量返回一个值。

到目前为止,我一直在通过新函数创建新变量,例如:

df.dummyVar = df.x.apply(lambda x: 1 if x>100 else 0)

使用 StackOverflow 和文档,我只能找到如何将依赖于单个变量的函数应用于多个列(使用轴选项)。请帮忙。

【问题讨论】:

    标签: python lambda pandas conditional multiple-columns


    【解决方案1】:

    使用where:

    df['dummyVar '] = df['x'].where((df['x'] > 100) & (df['y'] < 50), df['y'])
    

    这将比执行应用操作快得多,因为它是矢量化的。

    【讨论】:

    • 这正是我所需要的。这很棒,因为我已经可以看到如何将其扩展为基于 3 个或更多变量的条件。谢谢!
    • @seeiespi 不客气,你可以接受这个作为答案,投票按钮下方会有一个勾号。使用应用和迭代应该始终是最后的选择,如果可能的话,找到一个对整个数据帧进行操作的方法
    【解决方案2】:

    像这样:

    f = lambda x, y: x if x>100 and y<50 else y
    

    Python 中的 Lambda(s) 等价于普通函数定义。

    def f(x, y):
        return x if x>100 and y<50 else y
    

    注意: Lambda 的主体必须是有效的表达式。这意味着您不能使用以下内容:例如:return; Lambda 将返回最后评估的表达式。

    如需阅读,请参阅:

    【讨论】:

    • 我实际上已经写了一个这样的函数,但无法实现,这样它就可以在没有循环的情况下遍历每一行。 EdChum 提供的答案正是如此。如果你知道使用这个定义的函数来完成它的方法,我相信我将来可以使用它。谢谢你的输入:)
    • @seeiespi 您最初询问“如何创建一个接受两个参数的 lambda 函数?” -- 这就是 :) -- EdChum 为您提供的答案更符合您对数据集和熊猫的意图。
    【解决方案3】:

    现在有一种非常简单的方法可以做到这一点。只需在数据集上使用 apply:

    df['dummy'] = df.apply(lambda row: row['x'] if row['x'] > 100 and row['y'] < 50 else row['y'])
    

    【讨论】:

    • 我需要写axis = 1才能让它工作
    猜你喜欢
    • 2015-08-15
    • 2018-05-11
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    相关资源
    最近更新 更多