Python 如何计算pyspark dataframe中多列中一列中每个分类变量的频率?
我想计算列中每个类别的频率,并用频率计数替换列中的值。我想对pyspark数据帧的pyspark中的多个列执行此操作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 |
例如,考虑下面的数据文件:
+-------+-------+-------+
| 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|
+-----+-----+-----+