【问题标题】:Groupby / Merging / Rolling up dataframeGroupby /合并/汇总数据框
【发布时间】:2021-10-01 22:52:49
【问题描述】:

首先 - 我很迷茫,我什至不知道如何表达/命名我的问题。

我的第一个数据框是键值对,我用一些简单的代码将其转出,它为我提供了您可以在图 1 中看到的数据框:

df = df.groupBy("ID", "SUBID").pivot("SOURCE", fields).agg(first(F.col("VALUE")))

它有我想要的,但我认为我需要再次分组或合并或 某事 以获得我想要的结果,图 2..

我尝试了一些方法,但似乎都没有。对我来说唯一有意义的是我需要另一个 group by 或某种自我加入?

我想要的结果(据我所知,这都是针对同一个人 [ID])将类似于以下内容...相同的Name 已被全面应用,相同的surname,相同的@987654329 @ 等。包含值的单元格将保留其当前值。

请寻求任何建议或重复问题。

【问题讨论】:

标签: python pyspark apache-spark-sql


【解决方案1】:

id 列创建一个窗口,然后检查所有其他列是否每个窗口中的值都是唯一的。如果是这样,请将 null 值替换为此唯一值,否则将 nulls 替换为 ###

#creating some test data
data=[[1,'abc',None, 'def'],
      [1, None,None, 'ghi'],
      [1, None,'xyz', 'jkl'],
      [1, None,'XYZ', 'mno'],
      [2, '123','456', None],
      [2, None,None, '789']
    ]
df=spark.createDataFrame(data, ["id", "col1", "col2", "col3"])
#+---+----+----+----+
#| id|col1|col2|col3|
#+---+----+----+----+
#|  1| abc|null| def|
#|  1|null|null| ghi|
#|  1|null| xyz| jkl|
#|  1|null| XYZ| mno|
#|  2| 123| 456|null|
#|  2|null|null| 789|
#+---+----+----+----+

w = Window.partitionBy("id")

filled_cols=[F.col("id")] + \
  [F.coalesce(c,
    F.when(F.size(F.collect_set(c).over(w))==1, 
    F.collect_set(c).over(w)[0]).otherwise("###")).alias(c) 
  for c in df.columns if c != "id"]

df.select(filled_cols).show()
#+---+----+----+----+
#| id|col1|col2|col3|
#+---+----+----+----+
#|  1| abc| ###| def|
#|  1| abc| ###| ghi|
#|  1| abc| xyz| jkl|
#|  1| abc| XYZ| mno|
#|  2| 123| 456| 789|
#|  2| 123| 456| 789|
#+---+----+----+----+

【讨论】:

  • 这太好了 - 谢谢 Werner,会玩的 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
相关资源
最近更新 更多