检索任意行以获取数据框中列的唯一组合

Posted

技术标签:

【中文标题】检索任意行以获取数据框中列的唯一组合【英文标题】:Retrieve arbitrary row for unique combination of columns in a dataframe 【发布时间】:2016-04-09 14:49:06 【问题描述】:

我在数据框中有以下数据

col1    col2    col3    col4
1       desc1    v1      v3
2       desc2    v4      v2
1       desc1    v4      v2
2       desc2    v1      v3

我只需要 col1,col2 的每个唯一组合的第一行,如下所示

Expected Output:

col1    col2    col3    col4
1       desc1    v1      v3
2       desc2    v4      v2

如何在 pyspark(1.3.1 版)中实现这一点?

我尝试通过将数据帧转换为 rdd,然后应用 map 和 reduceByKey 函数,然后将结果 rdd 转换回数据帧来实现相同的效果。有没有其他方法可以使用数据框函数执行上述操作?

【问题讨论】:

是否有逻辑顺序需要考虑? 为了更清楚:第一行/最后一行不是强制性的。我需要 (col1,col2) 的不同值以及来自同一行的 (col3,col4) 的任何值。我无法使用 min 或 max 之类的聚合函数,因为它们会从不同的行中获取 col3 和 col4 的值。 如果我可以再引入一个列(col5),其值为: row_number() over (partition by col1,col2 order by col1,col2 asc) ,我可以使用新的过滤掉第一行列 - col5 = 1。 ***.com/a/35226857/1560062 spark 1.3.1 中不提供窗口函数。有没有办法让他们进来?? 【参考方案1】:

如果你想要一个任意行,你可以尝试使用firstlast,但它远非漂亮,我会认真考虑升级 Spark:

from pyspark.sql.functions import col, first

df = sc.parallelize([
  (1, "desc1", "v1", "v3"), (2, "desc2", "v4", "v2"),
  (1, "desc1", "v4", "v2"), (2, "desc2", "v1", "v3")
]).toDF(["col1", "col2", "col3", "col4"])

keys = ["col1", "col2"]
values = ["col3", "col4"]
agg_exprs = [first(c).alias(c) for c in keys + ["vs_"]]
select_exprs = keys + [
    "vs_.col0 AS 1".format(i + 1, v) for (i, v) in enumerate(values)]

df_not_so_first = (df
  .selectExpr("struct() AS vs_".format(",".join(values)), *keys)
  .groupBy(*keys)
  .agg(*agg_exprs)
  .selectExpr(*select_exprs))

请注意,在此特定上下文中 first 不选择任何特定行,结果可能不确定。此外,根据 Spark 版本,可以单独安排单独的聚合。这意味着

df.groupBy("col1", "col2").agg(first("col3"), first("col4"))

不保证col3col4 会从同一行中被选中。

【讨论】:

非常感谢。我使用了 first() 函数并尝试了以下方法。它工作正常。 df.groupBy(df.col1,df.col2).agg(df.col1,df.col2,first(df.col3).alias('col3'),first(df.col4).alias('col4') ).show() 你不应该单独使用它。根据版本和设置行为,您将获得不确定性。在groupBy 上下文中,它不会选择任何特定的行,因此如果单独安排单独的聚合,则无法保证您每次都从同一行甚至相同的值获取值。

以上是关于检索任意行以获取数据框中列的唯一组合的主要内容,如果未能解决你的问题,请参考以下文章

R - 根据条件组合行以获得平均值/平均值

比较两个数据框中列的值

过滤 Pyspark 中列的动态唯一组合

如何从 VB.net 组合框中的数据库中获取特定列的所有行?

表中列的唯一值组合

如何更改pyspark数据框中列的顺序?