news 2026/6/10 12:04:14

让我们重新审视包括新玩家 Pandas 在内的不同库中的 Case-When:

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
让我们重新审视包括新玩家 Pandas 在内的不同库中的 Case-When:

原文:towardsdatascience.com/lets-revisit-case-when-in-different-libraries-including-the-new-player-pandas-8c4febb979ba

无论您是在进行数据分析、数据清洗,甚至特征工程,创建基于其他列值的新列都是一个经常进行的操作。

我用于数据清洗和操作的所有工具都有用于此任务的函数(例如 SQL、R 数据表、PySpark)。我们现在游戏中有一个新玩家:Pandas。

顺便说一句,使用 Pandas 可以创建条件列,但它没有专门的 case-when 函数。

在 Pandas 2.2.0 版本中,引入了case_when函数,用于根据一个或多个条件创建一个 Series 对象。

让我们回顾一下如何使用常用的数据分析和处理工具完成这个非常有用的操作。

为了保持一致性并更容易地发现工具之间的差异,我们将使用一个小数据集。


SQL

以下是一个名为"mytable"的小 SQL 表。

+-------------+----------+---------+|a|b|c|+-------------+----------+---------+|0|5|1||1|-1|0||5|20|0||4|8|1||4|4|1||10|7|0||4|2|1|+-------------+----------+---------+

我们将基于现有列的值创建一个新列。以下是条件:

  • 如果列 a 大于列 b,则取列 a 的值

  • 如果列 a 小于列 b,则取列 a 和列 c 的乘积

  • 否则(即列 a 等于列 b),取列 a 和列 b 的和

我们可以创建所需数量的条件,并使它们变得更加复杂,但这三个条件足以学习 case when 逻辑。

让我们将新列命名为"d",以下是创建此列的 SQL 代码,基于上述两个条件:

select(casewhen a>b then a when a<b then a*celsea+b end)asdfrommytable

此 SQL 代码仅创建并选择"mytable"中的列 d。如果您还需要它返回其他列(即 a、b 和 c),只需在 select 语句中写出它们:

select a,b,c,(casewhen a>b then a when a<b then a*celsea+b end)asdfrommytable

R 数据表

数据表包是 R 编程语言的一个高效的数据分析和操作工具。

现在,我们将学习如何使用此包创建条件列 d。首先,我们创建一个包含与我们的 SQL 表相同列的数据表。

mytable<-data.table(a=c(0,1,5,4,4,10,4),b=c(5,-1,20,8,4,7,2),c=c(1,0,0,1,1,0,1))

数据表中的逻辑条件可以使用fcase函数实现。我们可以写出条件,然后通过逗号分隔的相应值。

以下是我们可以根据之前给出的条件创建列 d 的方法:

mytable[,d:=(fcase(a>b,a,a<b,a*c,a==b,a+b))]

fcase函数中的第一个表达式(a > b)是第一个条件,第二个表达式(a)是其对应值。第三个表达式(a < b)是第二个条件,第四个表达式(a*c)是其对应值,依此类推。

现在数据表"mytable"看起来如下所示:

a b c d1:05102:1-1013:520004:48145:44186:1070107:4214

PySpark

PySpark 是 Spark 的 Python API,Spark 是一个用于大规模数据处理的分析引擎。当涉及到处理数十亿行数据的集时,Spark 通常是首选工具。

PySpark API 非常直观,语法易于理解。让我们首先创建一个包含与之前相同的列和值的 Spark DataFrame。

frompyspark.sqlimportSparkSessionfrompyspark.sqlimportfunctionsasF spark=SparkSession.builder.getOrCreate()data=[{"a":0,"b":5,"c":1},{"a":1,"b":-1,"c":0},{"a":5,"b":20,"c":0},{"a":4,"b":8,"c":1},{"a":4,"b":4,"c":1},{"a":10,"b":7,"c":0},{"a":4,"b":2,"c":1}]mytable=spark.createDataFrame(data)

我们首先启动了一个 spark 会话,然后创建了 DataFrame。请注意,如果你在一个像 Databricks 这样的开发环境中工作,你不需要明确创建 spark 会话。

我们可以使用withColumn函数来创建新列,并基于我们将使用的多个条件来确定其值,可以使用when函数。

mytable=(mytable.withColumn("d",F.when(F.col("a")&gt;F.col("b"),F.col("a")).when(F.col("a")&lt;F.col("b"),F.col("a")*F.col("c")).otherwise(F.col("a")+F.col("b"))))mytable.show()+---+---+---+---+|a|b|c|d|+---+---+---+---+|0|5|1|0||1|-1|0|1||5|20|0|0||4|8|1|4||4|4|1|8||10|7|0|10||4|2|1|4|+---+---+---+---+

与之前的工具一样,我们可以根据需要组合多个条件。每个条件都将有自己的when函数,而最终条件(即如果前面的所有条件都不满足)的值将使用otherwise函数指定。


Pandas

Pandas 可能是最常使用的数据分析和操作工具。在 2.2.0 版本之前,我们没有在 Pandas 中遇到函数的情况。我们仍然可以使用其他函数(如 Pandas 的where函数或 NumPy 的whereselect函数)来处理这些操作。然而,现在 Pandas 中有一个case_when函数,让我们看看它是如何被用来完成我们在本文中用其他工具展示的任务的。

让我们首先创建 Pandas DataFrame。

importpandasaspd mytable=pd.DataFrame({"a":[0,1,5,4,4,10,4],"b":[5,-1,20,8,4,7,2],"c":[1,0,0,1,1,0,1]})

case_when函数接受一个案例列表作为参数,该列表包含条件和相应的值作为tuples。

caselist=[(mytable["a"]&gt;mytable["b"],mytable["a"]),(mytable["a"]&lt;mytable["b"],mytable["a"]*mytable["c"]),(mytable["a"]==mytable["b"],mytable["a"]+mytable["b"])]mytable.loc[:,"d"]=mytable["a"].case_when(caselist)mytable a b c d0051011-1012520003481444418510701064214

caselist中的每个元组包含一个条件和相应的值。重要的是要注意,case_when函数是应用于 DataFrame 中的列。如果有任何行没有满足给定的任何条件,那么新列中的该行将取原始列的值。

在上面的例子中,如果有这样的行,列 d 中的对应值将来自列 a。让我们通过在caselist中移除最后一个条件来试一试。

caselist=[(mytable["a"]&gt;mytable["b"],mytable["a"]),(mytable["a"]&lt;mytable["b"],mytable["a"]*mytable["c"])]mytable.loc[:,"d"]=mytable["a"].case_when(caselist)mytable a b c d0051011-1012520003481444414510701064214

看看第 4 行的值。列 d 的值与列 a 的值相同。


最后的话

数据清洗、分析和操作有很多工具和库。在大多数情况下,你使用哪个工具是一个选择问题。所有这些工具都能高效地完成典型任务。然而,了解如何使用不同的工具进行某些操作仍然是个好主意。

在这篇文章中,我们学习了如何使用 SQL、PySpark、R 数据表和 Pandas 创建条件列。

感谢阅读。如果您有任何反馈,请告诉我。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 5:42:53

JVM之垃圾回收算法(GC)

垃圾回收算法的思想 垃圾回收的基本思想是考察每一个对象的可触及性&#xff0c;即从根节点开始是否可以访问到这个对象&#xff0c;如果可以&#xff0c;则说明当前对象正在被使用&#xff0c;如果从所有的根节点都无法访问到某个对象&#xff0c;说明对象已经不再使用了&…

作者头像 李华
网站建设 2026/6/7 23:21:03

Bodymovin扩展面板:零基础快速上手AE动画导出

Bodymovin扩展面板&#xff1a;零基础快速上手AE动画导出 【免费下载链接】bodymovin-extension Bodymovin UI extension panel 项目地址: https://gitcode.com/gh_mirrors/bod/bodymovin-extension 还在为After Effects动画无法在网页上展示而烦恼吗&#xff1f;Bodymo…

作者头像 李华
网站建设 2026/6/4 23:54:41

Python 降级

Python 降级方法使用 conda 降级 Python 版本conda 是一个流行的包管理工具&#xff0c;可以方便地管理 Python 环境。通过 conda 可以创建新的环境并指定 Python 版本。conda create -n py36 python3.6 conda activate py36使用 pyenv 降级 Python 版本pyenv 是一个 Python 版…

作者头像 李华
网站建设 2026/5/28 11:41:04

FLORIS v4.4风电场仿真终极指南:突破传统局限的技术革新

FLORIS v4.4风电场仿真终极指南&#xff1a;突破传统局限的技术革新 【免费下载链接】floris A controls-oriented engineering wake model. 项目地址: https://gitcode.com/gh_mirrors/fl/floris FLORIS作为美国国家可再生能源实验室(NREL)开发的开源风电场仿真工具&am…

作者头像 李华
网站建设 2026/6/6 10:43:15

EverythingToolbar终极解决方案:Windows任务栏搜索效率提升300%

EverythingToolbar终极解决方案&#xff1a;Windows任务栏搜索效率提升300% 【免费下载链接】EverythingToolbar Everything integration for the Windows taskbar. 项目地址: https://gitcode.com/gh_mirrors/eve/EverythingToolbar 还在为Windows自带的搜索功能效率低…

作者头像 李华
网站建设 2026/6/8 6:43:28

Thief终极指南:3分钟掌握职场高效休息秘诀

Thief终极指南&#xff1a;3分钟掌握职场高效休息秘诀 【免费下载链接】Thief 一款创新跨平台摸鱼神器&#xff0c;支持小说、股票、网页、视频、直播、PDF、游戏等摸鱼模式&#xff0c;为上班族打造的上班必备神器&#xff0c;使用此软件可以让上班倍感轻松&#xff0c;远离 I…

作者头像 李华