2016-10-24 3 views
1

내가처럼 보이는 dataframe 객체가 있습니다스칼라 상대 주파수

+--+----+----+----+----+----+----+----+----+----+-----+ 
|id|bin1|bin2|bin3|bin4|bin5|bin6|bin7|bin8|bin9|bin10| 
+--+----+----+----+----+----+----+----+----+----+-----+ 
|a | 1|null|null|null|null| 1| 14| 91| 929| null| 
|c | 4| 2| 5| 82| 49| 176| 222| 439|null| null| 
|f | 1| 1|null|null| 2| 8| 226| 294| 2| null| 
|e |null| 1| 2|null| 4| 13| 19| 242| 752| 1| 
|y | 1| 1| 3| 9| 11| 17| 136| 664| 338| null| 
|e | 4| 2| 1| 8| 14| 169| 952| 431|null| null| 

어떻게 상대 값 (주파수)와 절대 값을 대체 할 수 있습니까?

편집 : 변환 한 후, 첫 번째 행에 대한 dataframe 개체는 다음과 같이 표시한다 :

+--+----+----+----+----+----+----+-----+------+-----+-----+ 
|id|bin1|bin2|bin3|bin4|bin5|bin6|bin7 |bin8 |bin9 |bin10| 
+--+----+----+----+----+----+----+-----+------+-----+-----+ 
|a | 0.0|null|null|null|null| 0.0| 0.01| 0.09| 0.90| null| 

알고리즘은 행의 합계에 의해 셀마다의 값을 분할한다. 이 변환 후에 행의 합계는 항상 1입니다.

지도를 사용하여 얻을 수 있다고 생각하지만 어떻게해야하는지 잘 모릅니다.

+0

당신이 예상 출력은 어떠해야하는지 보여줄 수 있다면 도움이 될 것입니다. – Brian

+0

의견을 보내 주셔서 감사합니다. 나는 나의 포스트를 편집했고, 그것이 더 명백하게하기를 바란다. – cronoik

+0

지금까지 시도한 것을 추가 할 수 있습니까? 그리고,이 숙제는 무엇입니까? – Jeremy

답변

1

여기, 당신은 null s는 0으로 처리 할 것을 가정하면 하나 개의 솔루션입니다 :

scala> var df = Seq((1d,2d,Double.NaN),(Double.NaN, 3d,4d), (5d, Double.NaN, 6d)).toDF("a", "b", "c") 
df: org.apache.spark.sql.DataFrame = [a: double, b: double, c: double] 

scala> df.show 
+---+---+---+ 
| a| b| c| 
+---+---+---+ 
|1.0|2.0|NaN| 
|NaN|3.0|4.0| 
|5.0|NaN|6.0| 
+---+---+---+ 

scala> val cols = df.columns 
cols: Array[String] = Array(a, b, c) 

scala> import org.apache.spark.sql.DataFrameNaFunctions 

scala> df = df.na.fill(0d).withColumn("sum", cols.map(col).reduce(_ + _)) 
df: org.apache.spark.sql.DataFrame = [a: double, b: double, c: double, sum: double] 

scala> df.show 
+---+---+---+----+ 
| a| b| c| sum| 
+---+---+---+----+ 
|1.0|2.0|0.0| 3.0| 
|0.0|3.0|4.0| 7.0| 
|5.0|0.0|6.0|11.0| 
+---+---+---+----+ 


scala> cols.foreach(cName => df = df.withColumn(cName, df.col(cName)/df.col("sum"))) 

scala> df.drop("sum").show 
+-------------------+-------------------+------------------+ 
|     a|     b|     c| 
+-------------------+-------------------+------------------+ 
| 0.3333333333333333| 0.6666666666666666|    0.0| 
|    0.0|0.42857142857142855|0.5714285714285714| 
|0.45454545454545453|    0.0|0.5454545454545454| 
+-------------------+-------------------+------------------+ 
+0

감사합니다. 당신의 본보기가 많이 도움이되었습니다. – cronoik