python - 如何在 pyspark 中对具有动态列的表进行透视

标签 python pyspark pivot multiple-columns

是否有可能在 Pyspark 中同时为不同的列创建数据透视表? 我有一个像这样的数据框:

sdf = spark.createDataFrame(
    pd.DataFrame([[1,2,6,1],[1,3,3,2],[1,6,0,3],[2,1,0,1],
        [2,1,7,2],[2,7,8,3]], columns = ['id','val1','val2','month'])
)
+----+------+------+-------+
| id | val1 | val2 | month |
+----+------+------+-------+
|  1 |   2  |   6  |   1   |
|  1 |   3  |   3  |   2   |
|  1 |   6  |   0  |   3   |
|  2 |   1  |   0  |   1   |
|  2 |   1  |   7  |   2   |
|  2 |   7  |   8  |   3   |
+----+------+------+-------+

我想在多个列(val1,val2,...)上旋转此数据框以获得如下所示的数据框:

+----+-------------+-------------+-------------+-------------+-------------+-------------+
| id | val1_month1 | val1_month2 | val1_month3 | val2_month1 | val2_month2 | val2_month3 |
+----+-------------+-------------+-------------+-------------+-------------+-------------+
|  1 |           2 |           3 |           6 |           6 |           3 |           0 |
|  2 |           1 |           1 |           7 |           0 |           7 |           8 |
+----+-------------+-------------+-------------+-------------+-------------+-------------+

我找到了一个适用于硬编码列的解决方案(见下文),但我正在寻找一个可以动态获取 val1、val2 等的解决方案。

sdf_pivot = (
    sdf
    .groupby('id')
    .pivot('month')
    .agg(sf.mean('val1'),sf.mean('val2'))
)

类似这样的东西,但不幸的是这不起作用......

col_to_pivot = ['val1','val2']
sdf_pivot = (
    sdf
    .groupby('id')
    .pivot('month')
    .agg(sf.mean(col_to_pivot))
)

非常感谢!

最佳答案

IIUC,您可以使用列表理解:

newdf = sdf.groupby('id').pivot('month').agg(*[ sf.mean(c).alias(c) for c in col_to_pivot ])
#+---+------+------+------+------+------+------+                                 
#| id|1_val1|1_val2|2_val1|2_val2|3_val1|3_val2|
#+---+------+------+------+------+------+------+
#|  1|     2|     6|     3|     3|     6|     0|
#|  2|     1|     0|     1|     7|     7|     8|
#+---+------+------+------+------+------+------+

col_names = [ '{}_month{}'.format(x[1],x[0]) if len(x)>1 else x[0] for c in newdf.columns for x in [c.split('_')] ]
#['id',
# 'val1_month1',
# 'val2_month1',
# 'val1_month2',
# 'val2_month2',
# 'val1_month3',
# 'val2_month3']

newdf = newdf.toDF(*col_names)

关于python - 如何在 pyspark 中对具有动态列的表进行透视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58307217/

相关文章:

python - "s"在 WordNet 同义词集中代表什么词性

python - 有没有办法在 Python 中将代码转换为字符串,反之亦然?

pandas - PySpark Tabula-Py Read_PDF(错误 : No module named 'org.apache.commons' )

mysql - Mysql 数据透视表

google-sheets - 具有多个类别的堆叠图表存储在单个列中 - Google 表格

python - 属性错误: Unknown property cmap

python - 使用 Tesseract 识别页面上的单个字符

pyspark - 错误 : TimestampType can not accept object while creating a Spark dataframe from a list

python - 保存和加载自动编码器

sql - SQL Server 2008 中的数据透视表