当前位置: 首页 > news >正文

让我们重新审视包括新玩家 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 创建条件列。

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

http://www.jsqmd.com/news/207172/

相关文章:

  • BlindWaterMark盲水印终极指南:5分钟学会图像版权保护
  • HunyuanVideo-Foley:革命性AI音效生成技术重塑视频创作生态
  • vivado安装包组件选择策略:入门级完整示例参考
  • 使用 Python 多线程提升你的编码技能
  • 2026专科生必备!8个降AI率工具测评榜单
  • ESP32连接阿里云MQTT:网络协议栈配置实战案例
  • [特殊字符]_网络IO性能优化:从TCP到HTTP的层层优化[20260106161818]
  • SAPlink终极指南:5个技巧掌握ABAP对象高效管理
  • 利用 KeyBERT、HDBSCAN 和 Zephyr-7B-Beta 构建知识图谱
  • ms-swift支持训练任务超时自动终止释放资源
  • STNodeEditor实战指南:构建高效可视化编程工作流
  • 得意黑 Smiley Sans 字体安装与应用全攻略:从下载到专业设计的完美指南
  • 盲水印终极使用指南:保护图像版权的完整解决方案
  • 常见网络安全威胁和防御措施
  • ncmdumpGUI终极指南:网易云音乐NCM格式转换完整解决方案
  • 终极SAP开发利器:SAPlink高效代码迁移完全指南
  • 视频字幕制作效率革命:AI智能助手如何10倍提升创作生产力
  • 强力解锁ArchiMate企业架构建模:3步安装与5大核心功能深度解析
  • 解决WPS中Zotero插件双图标冲突的实用指南
  • KLayout终极指南:从入门到精通的完整版图设计解决方案
  • ms-swift支持训练资源使用率报表生成
  • EverythingToolbar:重新定义Windows任务栏搜索体验
  • KLayout专业版图设计:从入门到精通的完整解决方案
  • Steam成就管理终极指南:7步轻松掌握SteamAchievementManager
  • STNodeEditor终极指南:零基础掌握C可视化编程工具
  • 服务器中毒怎么办?企业数据安全需重视
  • 3步搞定FastReport自定义字体配置,让报表瞬间变专业!
  • OpenTodoList:重新定义你的开源任务管理体验
  • 从无人机影像到专业地图:OpenDroneMap全流程实战指南
  • 如何快速掌握开源字体安装:得意黑 Smiley Sans 终极完整指南