我有一个带有值的数据
#+-------+---------+-----+
#|name1 |name 2 |score|
#+-------+---------+-----+
#| abcdef| abcghi | 3|
#| abcdef| abcjkl | 3|
#| abcdef| abcyui | 3|
#| abcdef| abrtyu | 4|
#| pqrstu| pqrswe | 2|
#| pqrstu| pqrsqw | 2|
#| pqrstu| pqrzxc | 3|
#+-------+---------+-----+
我需要按name1分组,选择得分最少的行。
据我所知,我可以在name1上的groupby之后选择最上面的行,并按升序对得分进行排序,并选择第一行。我这么做是靠
joined_windows = Window().partitionBy("name1").orderBy(col("score").asc())
result = joined_df.withColumn("rn", row_number().over(joined_windows)).where(col("rn") == 1).drop("rn")
但是,我希望dataframe保存以下值(即,每组中得分最少的行集)。
#+-------+---------+-----+
#|name1 |name 2 |score|
#+-------+---------+-----+
#| abcdef| abcghi | 3|
#| abcdef| abcjkl | 3|
#| abcdef| abcyui | 3|
#| pqrstu| pqrswe | 2|
#| pqrstu| pqrsqw | 2|
#+-------+---------+-----+
发布于 2018-09-19 04:22:49
对于持有几个值,可以使用这样的代码:
val joined_windows = Window.partitionBy("name1")
val result = df.withColumn("rn", min($"score").over(joined_windows))
result.where($"rn"===$"score").drop("rn").show(false)
输出:
+------+------+-----+
|name1 |name 2|score|
+------+------+-----+
|abcdef|abcghi|3 |
|abcdef|abcjkl|3 |
|abcdef|abcyui|3 |
|pqrstu|pqrswe|2 |
|pqrstu|pqrsqw|2 |
+------+------+-----+
发布于 2018-09-19 05:37:21
您可以按两列分组:
df \
.groupBy('name1', 'name2') \
.agg(F.min('score'))
https://stackoverflow.com/questions/52405485
复制相似问题