簡體   English   中英

Pyspark 動態過濾 dataframe

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM