Python 如何计算pyspark dataframe中多列中一列中每个分类变量的频率?

Python 如何计算pyspark dataframe中多列中一列中每个分类变量的频率?,python,pyspark,Python,Pyspark,我想计算列中每个类别的频率,并用频率计数替换列中的值。我想对pyspark数据帧的pyspark中的多个列执行此操作 例如,考虑下面的数据文件: +-------+-------+-------+ | col_1 | col_2 | col_3 | +-------+-------+-------+ | a | f | g | | c | e | a | | a | d | g | | a |

我想计算列中每个类别的频率,并用频率计数替换列中的值。我想对pyspark数据帧的pyspark中的多个列执行此操作

例如,考虑下面的数据文件:

+-------+-------+-------+  
| col_1 | col_2 | col_3 |
+-------+-------+-------+  
|   a   |   f   |   g   |  
|   c   |   e   |   a   |  
|   a   |   d   |   g   |  
|   a   |   d   |   g   |  
|   b   |   f   |   b   |  
|   c   |   d   |   g   |  
|   b   |   d   |   c   |  
|   a   |   d   |   g   |  
|   b   |   f   |   g   |  
+-------+-------+-------+  
我想将此pyspark数据帧转换为以下格式:

+-------+-------+-------+  
| col_1 | col_2 | col_3 |
+-------+-------+-------+ 
|   4   |   3   |   6   |
|   2   |   1   |   1   |
|   4   |   5   |   6   |
|   4   |   5   |   6   |
|   3   |   2   |   1   |
|   2   |   5   |   6   |
|   3   |   5   |   1   |
|   4   |   5   |   6   |
|   3   |   2   |   6   |
+-------+-------+-------+  
我有以下代码:

spark=SparkSession.builder.getOrCreate()
df=火花.读取.拼花地板(数据)
df.show()
+-------+-------+-------+
|第1列|第2列|第3列|
+-------+-------+-------+
|a | f | g|
|c | e | a|
|a | d | g|
|a | d | g|
|b | f | b|
|c | d | g|
|b | d | c|
|a | d | g|
|b | f | g|
+-------+-------+-------+
我可以使用for循环使用以下代码计算每列的频率:

df.groupby('col_1').count().toDF('category','count').show()

我知道我可以对每一列都这样做,并将结果粘在一起。我想知道是否有更好的方法来实现这一点。

您可以通过以下功能来实现:

导入pyspark.sql.F函数
从pyspark.sql导入窗口
l=[
(‘a’、‘f’、‘g’),
(‘c’、‘e’、‘a’),
(‘a’、‘d’、‘g’),
(‘a’、‘d’、‘g’),
(‘b’、‘f’、‘b’),
(‘c’、‘d’、‘g’),
(‘b’、‘d’、‘c’),
(‘a’、‘d’、‘g’),
(‘b’、‘f’、‘g’)
]
列=['col_1'、'col_2'、'col_3']
df=spark.createDataFrame(l,列)
对于列中的列:
df=df.withColumn(column,F.count(column).over(Window.partitionBy(column)))
df.show()
输出:

+----+----+----+
|第1列|第2列|第3列|
+-----+-----+-----+ 
|    4|    3|    6| 
|    3|    3|    6| 
|    4|    5|    6| 
|    4|    5|    6| 
|    4|    5|    6| 
|    2|    5|    6| 
|    3|    5|    1| 
|    3|    3|    1| 
|    2|    1|    1|
+-----+-----+-----+

您可以通过以下功能实现:

导入pyspark.sql.F函数
从pyspark.sql导入窗口
l=[
(‘a’、‘f’、‘g’),
(‘c’、‘e’、‘a’),
(‘a’、‘d’、‘g’),
(‘a’、‘d’、‘g’),
(‘b’、‘f’、‘b’),
(‘c’、‘d’、‘g’),
(‘b’、‘d’、‘c’),
(‘a’、‘d’、‘g’),
(‘b’、‘f’、‘g’)
]
列=['col_1'、'col_2'、'col_3']
df=spark.createDataFrame(l,列)
对于列中的列:
df=df.withColumn(column,F.count(column).over(Window.partitionBy(column)))
df.show()
输出:

+----+----+----+
|第1列|第2列|第3列|
+-----+-----+-----+ 
|    4|    3|    6| 
|    3|    3|    6| 
|    4|    5|    6| 
|    4|    5|    6| 
|    4|    5|    6| 
|    2|    5|    6| 
|    3|    5|    1| 
|    3|    3|    1| 
|    2|    1|    1|
+-----+-----+-----+