我有一个pyspark Dataframe ,其中包含许多 string 和 double 类型的列,格式如下:
+---+---+--------+-----+------+----+
|tin|ecu|DcyStart|did1 |did2 |did3|
+---+---+--------+-----+------+----+
|1 |1 |1 |34 |null |null|
|1 |1 |2 |null |2 |null|
|1 |1 |3 |null |null |b |
|1 |1 |4 |null |null |null|
|1 |2 |1 |40 |null |null|
|1 |2 |2 |null |2 |null|
|1 |2 |3 |null |null |f |
|1 |2 |4 |null |null |null|
+---+---+--------+----+-------+----+
其中每个 did-列应该只在具有特定 DcyStart 值的行中具有值。我对DcyStart中的信息不感兴趣,我希望删除它以减少表大小并消除空条目。
我尝试对 tin 和 ecu 进行分组,然后使用不同的函数(如first()
、max()
等)聚合 DcyStart 范围内的所有 did 列,但这些函数失败的原因有两个:
- agg函数无法处理 * 字符串 *
- agg函数只能将一列作为参数
我已经尝试了以下代码的几种变体:
list_of_dids = ["did1", "did2", "did3"]
data.groupBy("tin", "ecu").first(*list_of_dids)
但它总是给我上面列出的两个错误之一。
有100多个不同的 did-列,其中一些列可能有多个 DcyStart 的值,但如果是这种情况,它们中的任何一个都可以用于“聚合”。
我想实现的是:
+---+----+-----+----+----+
|tin|ecu||did1 |did2|did3|
+---+----+-----+----+----+
|1 |1 |34 |2 |b |
|1 |2 |40 |2 |f |
+---+----+-----+----+----+
我该怎么解决这个问题?o_O
1条答案
按热度按时间qpgpyjmq1#
尝试使用这个. groupBy().agg(),您可以在一次运行中执行多个聚合。