[英]Pyspark filter dataframe dynamically
我想动态过滤输入 dataframe 中的 null 值,因为值列可以来自 value(1)... value(n)
输入 Dataframe:
|dim1|dim2|TR_LIST|value1|value2|
| 101| 201|MTD0001| 1| 21|
| 101| 201|MTD0001| null| null|
| 101| 201|MTD0001| null| null|
| 102| 202|MTD0002| null| null|
| 102| 202|MTD0002| 2| 22|
| 102| 202|MTD0002| null| null|
| 103| 203|MTD0003| null| null|
| 103| 203|MTD0003| null| null|
| 103| 203|MTD0003| 3| 23|
Output Dataframe:
|dim1|dim2|TR_LIST|value1|value2|
| 101| 201|MTD0001| 1| 21|
| 102| 202|MTD0002| 2| 22|
| 103| 203|MTD0003| 3| 23|
我尝试使用 dataframe 的过滤方法中的 for 循环进行过滤,但出现类似错误(它应该是 str 或 column)。
我尝试使用的命令行:
list_valiue = [value1, value2] #Here i will be passing value columns as a list
df.filter(df.value.isNotNull() for value in list_value) #Throwing an error
我还尝试了另一种方法:
df.where(" AND ".join([df.%s.isNotNull())"%(li) for li in list_value])).show() # Even here I'm getting an error
请提供我在上述查询中可能犯的任何错误
我不明白你在这个例子中动态的意思,但null
可以使用.isNull
(你似乎知道)或dropna
。
当有多个要检查的列时,第二种方法似乎更合适
df = df.dropna(subset= ["value1", "value2"])
默认方法是any
但您也可以使用all
。 见文档
更一般地说,由于subset
参数,您可以根据需要尽可能多的列。
如果我误解了您的问题,请告诉我
您可以像这样编写过滤器:
from pyspark.sql import functions as sf
columns_to_check = ['value1', 'value2']
dynamic_filter = sf.col(columns_to_check[0]).isNotNull()
for column in columns_to_check[1:]:
dynamic_filter = dynamic_filter & sf.col(column).isNotNull()
df.filter(dynamic_filter)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.