pyspark 中的过滤值不相等
Filter values not equal in pyspark
我有一个 table 如下所示:
+---+----+----+
| id|Sell| Buy|
+---+----+----+
| A|null|null|
| B| Y| Y|
| C|null| Y|
| D| Y|null|
| E|null|null|
+---+----+----+
当值等于“Y”时,我可以轻松过滤单个或两个列。例如,当两列均为“Y”时,以下过滤器:
df.filter((df["Buy"] == "Y") & (df["Sell"] == "Y"))
但是,当单列或两列不等于“Y”时,我该如何过滤??每个案例的代码是什么?我试过这些代码,但它们 return 没有行:
df.filter((df["Buy"] != "Y") & (df["Sell"] != "Y"))
df.filter(~((df["Buy"] == "Y") | (df["Sell"] == "Y")))
它似乎没有捕获空值
我认为问题在于它们是 null,null 值有些特殊
试试这个来筛选 Buy
不是 Y
的值
df.filter((df["Buy"] != "Y") | (df["Buy"].isNull()))
因此,如果您想按照您尝试过的方式过滤买卖不在 'Y' 的地方,您需要这样做:
df.filter((df["Buy"] != "Y") | (df["Buy"].isNull()) & (df["Sell"] != "Y") | (df["Sell"].isNull()))
快速示例:
输入
+---+----+----+
| id|Sell| Buy|
+---+----+----+
| A|null|null|
| B| Y| Y|
| C| Y|null|
| D| Y|null|
| E|null|null|
+---+----+----+
输出
>>> df.filter((df["Buy"] != "Y") | (df["Buy"].isNull())).show(10)
+---+----+----+
| id|Sell| Buy|
+---+----+----+
| A|null|null|
| C| Y|null|
| D| Y|null|
| E|null|null|
+---+----+----+
>>> df.filter((df["Buy"] != "Y") | (df["Buy"].isNull()) & (df["Sell"] != "Y") | (df["Sell"].isNull())).show(10)
+---+----+----+
| id|Sell| Buy|
+---+----+----+
| A|null|null|
| E|null|null|
+---+----+----+
先填空值再做过滤
df.na.fill('N') \
.filter("Sell != 'Y' or Buy != 'Y'") \
.show(10, False)
df.na.fill('N') \
.filter("Sell != 'Y' and Buy != 'Y'") \
.show(10, False)
+---+----+---+
|id |Sell|Buy|
+---+----+---+
|A |N |N |
|C |N |Y |
|D |Y |N |
|E |N |N |
+---+----+---+
+---+----+---+
|id |Sell|Buy|
+---+----+---+
|A |N |N |
|E |N |N |
+---+----+---+
简单易行的解决方法是使用 null 安全运算符
df.filter(~((df["Buy"].eqNullSafe("Y")) | (df["Sell"].eqNullSafe("Y"))))
我有一个 table 如下所示:
+---+----+----+
| id|Sell| Buy|
+---+----+----+
| A|null|null|
| B| Y| Y|
| C|null| Y|
| D| Y|null|
| E|null|null|
+---+----+----+
当值等于“Y”时,我可以轻松过滤单个或两个列。例如,当两列均为“Y”时,以下过滤器:
df.filter((df["Buy"] == "Y") & (df["Sell"] == "Y"))
但是,当单列或两列不等于“Y”时,我该如何过滤??每个案例的代码是什么?我试过这些代码,但它们 return 没有行:
df.filter((df["Buy"] != "Y") & (df["Sell"] != "Y"))
df.filter(~((df["Buy"] == "Y") | (df["Sell"] == "Y")))
它似乎没有捕获空值
我认为问题在于它们是 null,null 值有些特殊
试试这个来筛选 Buy
不是 Y
df.filter((df["Buy"] != "Y") | (df["Buy"].isNull()))
因此,如果您想按照您尝试过的方式过滤买卖不在 'Y' 的地方,您需要这样做:
df.filter((df["Buy"] != "Y") | (df["Buy"].isNull()) & (df["Sell"] != "Y") | (df["Sell"].isNull()))
快速示例:
输入
+---+----+----+
| id|Sell| Buy|
+---+----+----+
| A|null|null|
| B| Y| Y|
| C| Y|null|
| D| Y|null|
| E|null|null|
+---+----+----+
输出
>>> df.filter((df["Buy"] != "Y") | (df["Buy"].isNull())).show(10)
+---+----+----+
| id|Sell| Buy|
+---+----+----+
| A|null|null|
| C| Y|null|
| D| Y|null|
| E|null|null|
+---+----+----+
>>> df.filter((df["Buy"] != "Y") | (df["Buy"].isNull()) & (df["Sell"] != "Y") | (df["Sell"].isNull())).show(10)
+---+----+----+
| id|Sell| Buy|
+---+----+----+
| A|null|null|
| E|null|null|
+---+----+----+
先填空值再做过滤
df.na.fill('N') \
.filter("Sell != 'Y' or Buy != 'Y'") \
.show(10, False)
df.na.fill('N') \
.filter("Sell != 'Y' and Buy != 'Y'") \
.show(10, False)
+---+----+---+
|id |Sell|Buy|
+---+----+---+
|A |N |N |
|C |N |Y |
|D |Y |N |
|E |N |N |
+---+----+---+
+---+----+---+
|id |Sell|Buy|
+---+----+---+
|A |N |N |
|E |N |N |
+---+----+---+
简单易行的解决方法是使用 null 安全运算符
df.filter(~((df["Buy"].eqNullSafe("Y")) | (df["Sell"].eqNullSafe("Y"))))