Dataframe GroupBy 在包含模式的列上聚合

Posted

技术标签:

【中文标题】Dataframe GroupBy 在包含模式的列上聚合【英文标题】:Dataframe GroupBy aggregate on column that contains pattern 【发布时间】:2017-02-21 20:07:31 【问题描述】:

我有一个数据框,其中包含 c1、c2 列。我想将它们分组在 c1 上并希望选择 c2 使得 c2 值包含一个模式,如果所有 c2 不包含模式返回任何人

示例 df :

c1  c2
1   ai_za
1   ah_px
1   ag_po
1   af_io
1   ae_aa
1   ad_iq
1   ac_on
1   ab_eh
1   aa_bs
2   aa_ab
2   aa_ac

如果 c2 中需要的模式是 '_io'

预期结果:

c1  c2
1   af_io
2   aa_ab

1 af_io 被返回,因为它包含 '_io' 模式

2 aa_ab 随机返回,因为第 2 组中没有人包含模式“_io”

如何使用 spark 数据帧/数据集 api 获取此信息?

【问题讨论】:

如果有多个行包含_io 模式,是否要选择所有行? 如果有多个包含_io模式,则选择第一行 【参考方案1】:

如果不匹配选哪一行也无所谓,可以试试:

df.groupByKey(_.getAs[Int]("c1")).
   reduceGroups((x, y) => if(x.getAs[String]("c2").matches(".*_io")) x else y).
   toDF("key", "value").
   select("value.c1", "value.c2").show

+---+-----+

| c1|   c2|
+---+-----+
|  1|af_io|
|  2|aa_ac|
+---+-----+

注意:这会选择与模式匹配的第一行,如果没有匹配则选择组中的最后一行。

【讨论】:

非常感谢@Psidom

以上是关于Dataframe GroupBy 在包含模式的列上聚合的主要内容,如果未能解决你的问题,请参考以下文章

如何在 groupby 2 列之后保留 DataFrame 的原始索引?

更新熊猫 groupby().last() 的列值

PySpark 1.5 Groupby Sum 用于 Dataframe 中的新列

从groupby中的列获取模式[重复]

以序列作为键参数的 Spark Dataframe groupBy [重复]

我可以使用 groupby 在 Pandas 数据框中创建每行是运行列表的列吗?