[英]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
名稱(如Velocity
和Temp
)執行此操作:下面是代碼,也請告訴我這是否是正確的做法或我該如何做。
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.