pyspark数据帧中的分组计数

问题描述 投票:0回答:1

我的数据框看起来像-

id      age      gender       category
1        34        m             b
1        34        m             c
1        34        m             b
2        28        f             a
2        28        f             b
3        23        f             c
3        23        f             c 
3        23        f             c 

我希望我的数据框看起来像-

id      age      gender       a      b      c
1        34        m          0      2      1
2        28        f          1      1      0
3        23        f          0      0      2

我已经完成-

from pyspark.sql import functions as F
df = df.groupby(['id','age','gender']).pivot('category').agg(F.count('category')).fillna(0)
df.show()

如何在pyspark中进行管理?是否可以通过任何正确的方法来管理此事物

pyspark pyspark-sql pyspark-dataframes
1个回答
0
投票

您的代码对我来说很好,但是当我尝试运行它时,我看到了

df = spark.read.csv('dbfs:/FileStore/tables/txt_sample.txt',header=True,inferSchema=True,sep="\t")
df = df.groupby(['id','age','gender']).pivot('category').agg(count('category')).fillna(0)
df.show()

df:pyspark.sql.dataframe.DataFrame = [id: integer, age: integer ... 5 more fields]
+---+---+------+---+---+---+---+
| id|age|gender|  a|  b|  c| c |
+---+---+------+---+---+---+---+
|  2| 28|     f|  1|  1|  0|  0|
|  1| 34|     m|  0|  2|  1|  0|
|  3| 23|     f|  0|  0|  1|  2|
+---+---+------+---+---+---+---+

这是由于最后两行中c后面有一个多余的空格字符。

只需使用rtrim()修剪空格

df = spark.read.csv('dbfs:/FileStore/tables/txt_sample.txt',header=True,inferSchema=True,sep='\t')
df = df.withColumn('Category',rtrim(df['category'])).drop(df['category'])
df = df.groupby(['id','age','gender']).pivot('Category').agg(count('Category')).fillna(0)
df.show()

df:pyspark.sql.dataframe.DataFrame = [id: integer, age: integer ... 4 more fields]
+---+---+------+---+---+---+
| id|age|gender|  a|  b|  c|
+---+---+------+---+---+---+
|  2| 28|     f|  1|  1|  0|
|  1| 34|     m|  0|  2|  1|
|  3| 23|     f|  0|  0|  3|
+---+---+------+---+---+---+
© www.soinside.com 2019 - 2024. All rights reserved.