2016-11-25 15 views
2

私はfromとtoの列を持つデータフレームを持っています。どちらも国コードで、出発国と目的地の国を示しています。グループごとのカウント数とpysparkを使用したピボット

+----+---+ 
|from| to| 
+----+---+ 
| TR| tr| 
| TR| tr| 
| TR| tr| 
| TR| gr| 
| ES| tr| 
| GR| tr| 
| CZ| it| 
| LU| it| 
| AR| it| 
| DE| it| 
| IT| it| 
| IT| it| 
| US| it| 
| GR| fr| 

発信元の各宛先国の割合と、宛先のすべての国コードを示すデータフレームを取得する方法はありますか?

パーセンテージは、同じ出身国(行)の合計目的地の中になければなりません。

+----+---+----+---+----+ 
|from| tr| it| fr| gr| 
+----+---+----+---+----+ 
| TR|0.6|0.12|0.2|0.09| 
| IT|0.3| 0.3|0.3| 0.8| 
| US|0.1|0.34|0.3| 0.2| 

答えて

2

あなたはcountpivotと結果を調整することができます。まず、いくつかの輸入:

from pyspark.sql.functions import col, lit, coalesce 
from itertools import chain 

検索レベル:

levels = [x for x in chain(*df.select("to").distinct().collect())] 

pivot

row_count = sum(coalesce(col(x), lit(0)) for x in levels) 

は調整のリストを作成します。

pivoted = df.groupBy("from").pivot("to", levels).count() 

compute行は、式を数えますエド・カラム:

adjusted = [(col(c)/row_count).alias(c) for c in levels] 

select

pivoted.select(col("from"), *adjusted) 
関連する問題