簡體   English   中英

pyspark中如何根據行列條件過濾多行

[英]How to filter multiple rows based on rows and columns condition in pyspark

我想根據“值”列過濾多行。 例如,我想從channel_name列過濾velocity ,其中value>=1 & value <=5 ,我想從channel_name列過濾Temp ,其中value>=0 & value <=2 下面是我的 Pysaprk DF。

開始時間戳 頻道名稱 價值
2020-11-02 08:51:50 速度 1
2020-11-02 09:14:29 溫度 0
2020-11-02 09:18:32 速度 0
2020-11-02 09:32:42 速度 4
2020-11-03 13:06:03 溫度 2
2020-11-03 13:10:01 溫度 1
2020-11-03 13:54:38 溫度 5
2020-11-03 14:46:25 速度 5
2020-11-03 14:57:31 公里 6
2020-11-03 15:07:07 公里 7

預期的DF:

開始時間戳 頻道名稱 價值
2020-11-02 08:51:50 速度 1
2020-11-02 09:32:42 速度 4
2020-11-03 14:46:25 速度 5
2020-11-02 09:14:29 溫度 0
2020-11-03 13:06:03 溫度 2
2020-11-03 13:10:01 溫度 1

我嘗試了 channel_name Velocity ,它工作正常。

df1=df.filter((df.channel_name ==  "velocity") & (df.interpreted_value >= 1 )  & (df.interpreted_value <= 5))

但我不知道如何為多個channel_name名稱(如VelocityTemp )執行此操作:下面是代碼,也請告訴我這是否是正確的做法或我該如何做。

df1=df.filter(((df.channel_name ==  "velocity") & (df.interpreted_value >= 1 )  & 
                  (df.interpreted_value <= 5))) &
              ((df.channel_name ==  "Temp") & (df.interpreted_value >= 0 )  & 
                  (df.interpreted_value <= 2)))) 

組合子句時,您需要使用or ( | ) 而不是and ( & ) 運算符:

import pyspark.sql.functions as F
import pyspark.sql.types as T
df = spark.createDataFrame([
  ("2020-11-02 08:51:50", "velocity", 1),
  ("2020-11-02 09:14:29", "Temp", 0),
  ("2020-11-02 09:18:32", "velocity", 0),
  ("2020-11-02 09:32:42", "velocity", 4),
  ("2020-11-03 13:06:03", "Temp", 2),
  ("2020-11-03 13:10:01", "Temp", 1),
  ("2020-11-03 13:54:38", "Temp", 5),
  ("2020-11-03 14:46:25", "velocity", 5),
  ("2020-11-03 14:57:31", "Kilometer",6),
  ("2020-11-03 15:07:07", "Kilometer", 7)], 
  ["start_timestamp", "channel_name", "value"]).withColumn("start_timestamp", F.to_timestamp("start_timestamp"))

df_filtered = df.filter((((df.channel_name ==  "velocity") & (df.value >= 1 )  & 
                  (df.value <= 5))) | # or instead of and
              ((df.channel_name ==  "Temp") & (df.value >= 0 )  & 
                  (df.value <= 2)))
df_filtered.show()

Output:

+-------------------+------------+-----+
|    start_timestamp|channel_name|value|
+-------------------+------------+-----+
|2020-11-02 08:51:50|    velocity|    1|
|2020-11-02 09:14:29|        Temp|    0|
|2020-11-02 09:32:42|    velocity|    4|
|2020-11-03 13:06:03|        Temp|    2|
|2020-11-03 13:10:01|        Temp|    1|
|2020-11-03 14:46:25|    velocity|    5|
+-------------------+------------+-----+

您當前應用的過濾器不會返回任何內容,因為您首先檢查通道名稱是否等於一個特定字符串,然后檢查它是否等於另一個特定字符串。 使用 or 時,只有一個子句為真,才能在結果 dataframe 中包含行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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