如何按列分组并聚合其余列
Posted
技术标签:
【中文标题】如何按列分组并聚合其余列【英文标题】:How to group by columns and aggregate rest of the columns 【发布时间】:2019-01-10 18:59:00 【问题描述】:我是 pyspark 的新手,如果有人能帮助解决问题,我将不胜感激。
假设我在 pyspark 中有如下数据框:
+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
| A|2001| 2| 5| 6|
| A|2001| 3| 6| 10|
| A|2001| 3| 6| 10|
| A|2002| 4| 5| 2|
| B|2001| 2| 9| 4|
| B|2001| 2| 4| 3|
| B|2001| 2| 3| 4|
| B|2001| 3| 95| 7|
+----+----+----+----+----+
如果col1
、col2
和col3
中的对应值相同,我想得到col4
的平均值,然后去掉前3 列中重复值的行.
例如,第一列两个col1
、col2
、col3
的值是相同的,所以,我们想消除其中一个,更新col4
的值作为平均值col4
和 col5
。结果应该是:
+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
| A|2001| 2| 4.5| 7|
| A|2001| 3| 6| 10|
| A|2002| 4| 5| 2|
| B|2001| 2|5.33|3.67|
| B|2001| 3| 95| 7|
+----+----+----+----+----+
类似的问题已经被问过,但在 pandas 数据框中。这个问题是在 pyspark 数据框中提出的
【问题讨论】:
IIUCdf.groupby("col1", "col2", "col3").agg(f.mean("col4"), f.mean("col5"))
其中f
由import pyspark.sql.functions as f
定义
Pyspark:How to calculate avg and count in a single groupBy?的可能重复
【参考方案1】:
第一步:创建上述DataFrame
-
values = [('A',2001,2,5,6),('A',2001,2,4,8),('A',2001,3,6,10),('A',2002,4,5,2),
('B',2001,2,9,4),('B',2001,2,4,3),('B',2001,2,3,4),('B',2001,3,95,7)]
df = sqlContext.createDataFrame(values,['col1','col2','col3','col4','col5'])
df.show()
+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
| A|2001| 2| 5| 6|
| A|2001| 2| 4| 8|
| A|2001| 3| 6| 10|
| A|2002| 4| 5| 2|
| B|2001| 2| 9| 4|
| B|2001| 2| 4| 3|
| B|2001| 2| 3| 4|
| B|2001| 3| 95| 7|
+----+----+----+----+----+
第 2 步:聚合列 col4
和 col5
。
df = df.groupby(['col1','col2','col3']).agg(avg('col4').alias('col4'),avg('col5').alias('col5'))
df.show()
+----+----+----+-----------------+------------------+
|col1|col2|col3| col4| col5|
+----+----+----+-----------------+------------------+
| A|2001| 3| 6.0| 10.0|
| A|2002| 4| 5.0| 2.0|
| B|2001| 2|5.333333333333333|3.6666666666666665|
| A|2001| 2| 4.5| 7.0|
| B|2001| 3| 95.0| 7.0|
+----+----+----+-----------------+------------------+
【讨论】:
以上是关于如何按列分组并聚合其余列的主要内容,如果未能解决你的问题,请参考以下文章