PySpark-DataFrame条件筛选

本文介绍了如何在PySpark中使用DataFrame进行数据筛选和过滤,包括.where()、.filter()方法,.isin()过滤以及funcs.when()函数来按条件处理数据。示例涵盖了多个条件的组合使用,以及处理NULL值和基于列表过滤数据。此外,还展示了如何根据条件对数据进行分类。
摘要由CSDN通过智能技术生成

目录

示例 DataFrame 

.where 条件筛选 

.filter 过滤

.isin 过滤

funcs.when()

示例 DataFrame 
# 创建一个SparkDataFrame
rdd = sc.parallelize([("Sam", 28, 88.52, "M"),
                      ("Flora", 28, 90.55, "F"),
                      ("Run", 25, 89.55, "F"),
                      ("Peter", None, 100.0, "F"),
                      ("Mei", 23, 70.4, "F")])
test_exp_data = rdd.toDF(["name", "age", "score", "sex"])
test_exp_data.show()
+-----+----+-----+---+
| name| age|score|sex|
+-----+----+-----+---+
|  Sam|  28|88.52|  M|
|Flora|  28|90.55|  F|
|  Run|  25|89.55|  F|
|Peter|null|100.0|  F|
|  Mei|  23| 70.4|  F|
+-----+----+-----+---+
.where 条件筛选 
方式1 用df['col']去比较条件,本质上是对布尔表达式的选择。 # 多个条件中的每个条件注意用()括起来,链接注意用& 而不是and 

test_exp_data.where((test_exp_data['score'] == 100) | (test_exp_data['name']== 'Run')).show()
输出: 

+-----+----+-----+---+
| name| age|score|sex|
+-----+----+-----+---+
|  Run|  25|89.55|  F|
|Peter|null|100.0|  F|
+-----+----+-----+---+
方式2 :where(conditionExpr: String):SQL语言中where关键字后的条件
传入筛选条件表达式,可以用and和or。得到DataFrame类型的返回结果,
示例:

test_exp_data.where("score = 100 or name = 'Run'").show()
输出: 

同上面方式1 一模一样
.filter 过滤
.filter过滤数据,其实作用和where一样。方式1 用df['col']去比较条件,本质上是对布尔表达式的选择。# 多个条件中的每个条件注意用()括起来,链接注意用& 而不是and 

test_exp_data.filter(test_exp_data['age']>24).show()
test_exp_data.filter((test_exp_data['age']>24) & (test_exp_data['score']>90)).show() # 多个条件中的每个条件注意用()括起来,链接注意用& 而不是and 
输出: 

+-----+---+-----+---+
| name|age|score|sex|
+-----+---+-----+---+
|  Sam| 28|88.52|  M|
|Flora| 28|90.55|  F|
|  Run| 25|89.55|  F|
+-----+---+-----+---+
+-----+---+-----+---+
| name|age|score|sex|
+-----+---+-----+---+
|Flora| 28|90.55|  F|
+-----+---+-----+---+
 
# 注意filter里面本质上是筛选bool表达式,多个条件时不能用and,如果用了会报错如” test_exp_data.filter((test_exp_data['age']>24) and (test_exp_data['score']>90)).show()“ 
报错: 提示 Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

方式2 : 里面嵌套sql 表达式的字段

test_exp_data.filter("age>24").show()
test_exp_data.filter("age>24 and score >90").show()
 
输出结果同上面方式1一模一样。 

对null数据进行过滤:筛选出某个字段为null的行(定义时为None,转换为dataframe可能就变成了null)。

两种方式

# 创建一个SparkDataFrame
rdd = sc.parallelize([("Sam", 28, 88.52, "M"),
                      ("Flora", 28, 90.55, "F"),
                      ("Run", 25, 89.55, "F"),
                      ("Peter", None, 100.0, "F"),
                      ("Mei", 23, 70.4, "F")])
test_exp_data = rdd.toDF(["name", "age", "score", "sex"])
test_exp_data.show()
# 方式1 
from pyspark.sql import functions as funcs
test_exp_data.filter(funcs.isnull("age")).show()
# 方式2 
test_exp_data.filter('age is null').show()
均输出: 

+-----+----+-----+---+
| name| age|score|sex|
+-----+----+-----+---+
|Peter|null|100.0|  F|
+-----+----+-----+---+
如果想保留不为null 的即为下面,注意方式1中 非需要用~ 而不是别的。这里本质上也是bool表达式

# 方式1 
from pyspark.sql import functions as funcs
test_exp_data.filter(~funcs.isnull("age")).show() #注意非需要用~ 而不是别的。这里本质上也是bool表达式
#方式2 
test_exp_data.filter("age is not null").show() # 非空的
结果均为: 

+-----+---+-----+---+
| name|age|score|sex|
+-----+---+-----+---+
|  Sam| 28|88.52|  M|
|Flora| 28|90.55|  F|
|  Run| 25|89.55|  F|
|  Mei| 23| 70.4|  F|
+-----+---+-----+---+
.isin 过滤
基于包含另一个数据框的列的内容过滤数据框。

test_exp_data[test_exp_data.name.isin('Sam','Run')].show()
输出: 

+----+---+-----+---+
|name|age|score|sex|
+----+---+-----+---+
| Sam| 28|88.52|  M|
| Run| 25|89.55|  F|
+----+---+-----+---+
也可以是 

test_exp_data[test_exp_data.name.isin(df2.column2)].show() 的形式; 筛选出test_exp_data中的name取值在df2中字段2的取值中出现过的 test_exp_data的各行数据,返回是一个DataFrame; 

其他实践: 

有两个数据集,从data_1中抽取出data_2中的相同的元素

可行的方式:
df_ori_part = df_ori[df_ori['user_pin'].isin(list(df_1['user_pin']))]
df_ori_part = df_ori.filter(df_ori['user_pin'].isin(list(df_1['user_pin'])) == True )
 
不可行:
df_ori_part = df_ori.filter(~df_ori['user_pin'].isin(list(df_1['user_pin'])) )
此处参考: PySpark︱DataFrame操作指南:增/删/改/查/合并/统计与数据处理_悟乙己的博客-CSDN博客

funcs.when()
按条件筛选 when(condition, value1).otherwise(value2)联合使用:那么:当满足条件condition的指赋值为values1,不满足条件的则赋值为values2.
otherwise表示,不满足条件的情况下,应该赋值为啥。

示例:多个when串联,对不同成绩分等级

test_exp_data.select('score',funcs.when(test_exp_data.score>90,'A').when(test_exp_data.score>80,'B').otherwise('C').alias('score_level')).show()
输出: 

+-----+-----------+
|score|score_level|
+-----+-----------+
|88.52|          B|
|90.55|          A|
|89.55|          B|
|100.0|          A|
| 70.4|          C|
+-----+-----------+
————————————————
版权声明:本文为CSDN博主「旺仔的算法coding笔记」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangwangstone/article/details/128555696

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值