当前位置: 首页 > 知识库问答 >
问题:

使用lambda函数基于其他列更改列值

洪高阳
2023-03-14

试图在熊猫中复制一个简单的Excel函数,但没有成功。还没有尝试np.where(),因为我想学习lambda函数,尽可能少依赖导入。

复制的函数:

=+IF([@[Coupa Type]]="freeform","Freeform","Structured PO")

Lambda我测试和工作:

lambdatest = lambda x: f"{x} is even" if x % 2 == 0 else f"{x} is odd"

不起作用的熊猫的λ:

test = raw[["Coupa Type", "Structured Pos"]]
test["Structured Pos"] = test.apply(
    lambda x: "Freeform" if test["Coupa Type"] == "freeform" else "Structured PO"
)

错误:

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我猜它试图计算整个列,而不是逐行计算,我该如何解决这个问题?

共有1个答案

冷涵忍
2023-03-14

我认为您需要在apply()调用中添加axis=1,以使lambda函数针对每一行而不是每一列执行,这是默认值:

test["Structured Pos"] = test.apply(
    lambda x: "Freeform" if x["Coupa Type"] == "freeform" else "Structured PO",
    axis=1,
)

(您还需要在Lambda函数中使用x["Coupa Type"]而不是test["Coupa Type"],就像我上面所做的那样。)

对于这种情况,一个更有效的解决方案是做一些与此相关的事情:

test["Structured Pos"] = test["Coupa Type"].map({"freeform": "Freeform"}).fillna("Structured PO")

…因为map用字典中的值替换系列中作为字典中键的所有值,以及系列中不属于字典中键的值,所以它将替换为NaN,因此您可以使用fillna提供默认值。

 类似资料:
  • 我想将我的自定义函数(它使用if-else梯形)应用到数据帧每行中的这六列(,,,,,)。 我已经尝试了不同的方法从其他问题,但似乎仍然不能找到正确的答案,我的问题。关键的一点是,如果这个人被算作西班牙裔,他们就不能算作其他任何东西。即使他们在另一个种族栏中有一个“1”,他们仍然被算作西班牙裔,而不是两个或两个以上的种族。类似地,如果所有ERI列的总和大于1,则被计为两个或两个以上的种族,不能被计

  • 我正在使用pyspark下面是我的数据

  • 我有以下问题,因为我是pyspark的新手。基于来自两列的值的条件,我想填充第三列。条件是: < li >如果分号包含在col2中,请检查col1 < ul > < li >如果col1 == 1,则取分号前的值 < li >如果col1 == 2,则取分号后的值 这就是数据帧的样子。 我创建了下面的udf,它给出了错误“不能将列转换为布尔值:请使用” 我通过谷歌搜索各种功能构建了这个udf,所以

  • 在我的scala程序中,我有一个dataframe,其中有两列和(类型都为)。除此之外,我有一个先前定义的对象和一些方法和属性。在这里,我想要使用dataframe的当前值和中的属性向dataframe添加一个新列。 例如,如果我有下面的dataframe: 谢谢你。

  • 问题内容: 我目前有一张看起来像这样的表: 我需要做的是获得“ 费率”列的信息,但每个名称仅获得一次。例如,我有三行John Doe,每行的比率为8。我需要将这些行的比率设为8,而不是24,因此它为每组名称都对比率进行一次计数。 当然是行不通的,因为我试图对比率列而不是名称求和。我知道在对单个记录进行计数时,我可以使用,这就是我试图从中得到的行为类型。 我怎样才能为每个名字获得一个比率? 提前致谢

  • 我有以下问题: 包含带有字符串 、 或 C 的 。 带有的第二个 。 以及其他三列 、 和 (这些列也命名为 、 和 )。 因此 应获得 现在我想遍历每一行,并根据 中的条目将 中的整数分配给列 A、B 或 C。 如何实现此目的? < code>df.withColumn()我不能使用(或者至少我不知道为什么),对于< code>val df2 = df.map(x = 提前期待您的帮助和感谢!