您可以使用 GroupedData 类的 pivot 函数,因为您只使用 1 和 0。示例代码:
l =[( 115 ,'A' ),
( 116 , 'B' ),
( 118 , 'C' ),
( 121 , 'D' ),
( 125 , 'E' ),
( 127 , 'F' ),
( 127 , 'G' ),
( 127 , 'H' ),
( 136 , 'I' ),
( 136 , 'J' )]
df = spark.createDataFrame(l, ['id','concepts'])
df.groupBy('id').pivot('concepts').count().show()
将导致以下数据框:
+---+----+----+----+----+----+----+----+----+----+----+
| id| A| B| C| D| E| F| G| H| I| J|
+---+----+----+----+----+----+----+----+----+----+----+
|136|null|null|null|null|null|null|null|null| 1| 1|
|116|null| 1|null|null|null|null|null|null|null|null|
|115| 1|null|null|null|null|null|null|null|null|null|
|127|null|null|null|null|null| 1| 1| 1|null|null|
|118|null|null| 1|null|null|null|null|null|null|null|
|125|null|null|null|null| 1|null|null|null|null|null|
|121|null|null|null| 1|null|null|null|null|null|null|
+---+----+----+----+----+----+----+----+----+----+----+
如果需要,用fill-函数替换空值。
cmets 中的某个人询问如何使用 pandas 来做到这一点。方法基本相同,但需要的函数是pivot_table。
import pandas as pd
import numpy as np
l =[( 115 ,'A' ),
( 116 , 'B' ),
( 118 , 'C' ),
( 121 , 'D' ),
( 125 , 'E' ),
( 127 , 'F' ),
( 127 , 'G' ),
( 127 , 'H' ),
( 136 , 'I' ),
( 136 , 'J' )]
df = pd.DataFrame(l,columns=['id','concepts'] )
df.pivot_table(index='id', columns='concepts', aggfunc=len)
输出:
concepts A B C D E F G H I J
id
115 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
116 NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN
118 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN
121 NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN
125 NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN
127 NaN NaN NaN NaN NaN 1.0 1.0 1.0 NaN NaN
136 NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0