我有一个PySpark DataFrame,我将其分组在一个字段(列)上,目的是为每个组删除具有另一个字段的特定值的记录。 例如,该表看起来像
colA colB
'a' 1
'b' 1
'a' 0
'c' 0
这里我想要的是删除colA重复且colB为0的记录,以便获取
colA colB
'a' 1
'b' 1
'c' 0
'p'的行仍然是因为我只想删除重复的(在colA上)行的0。
我无法想出实现这一目标的方法,因为如果agg
不是groupBy
,我就不会精通在expr
之后使用<asp:TextBox ID="contNoTxtBox" runat="server" Width="182px" style="height: 22px"></asp:TextBox>
的方式avg“,”max“等。
答案 0 :(得分:3)
简单max
怎么样?
from pyspark.sql.functions import max as max_
df = sc.parallelize([
('a', 1), ('b', 1), ('a', 0), ('c', 0)
]).toDF(('colA', 'colB'))
df.groupBy('colA').agg(max_('colB')).show()
## +----+---------+
## |colA|max(colB)|
## +----+---------+
## | a| 1|
## | b| 1|
## | c| 0|
## +----+---------+
此方法适用于任何支持排序的列,并使用二进制标签,并可选择调整您使用的聚合函数(min
/ max
)。
可以使用窗口函数实现更高级的规则,但它会更昂贵。
然而这是一个例子:
from pyspark.sql.functions import col, sum as sum_, when
from pyspark.sql import Window
import sys
w = Window.partitionBy("colA").rowsBetween(-sys.maxsize, sys.maxsize)
this_non_zero = col("colB") != 0
any_non_zero = sum_(this_non_zero.cast("long")).over(w) != 0
(df
.withColumn("this_non_zero", this_non_zero)
.withColumn("any_non_zero", any_non_zero)
.where(
(col("this_non_zero") & col("any_non_zero")) |
~col("any_non_zero")
))