从现有数据框创建新列

时间:2019-07-28 12:53:20

标签: scala dataframe apache-spark

我有一个数据框,并尝试根据以下条件从现有列中创建一个新列。

通过名为 event_type 的列对数据进行分组 仅过滤列的值为 train 的那些行,并将其命名为 X 。 新列的值为 X.sum / X.length

这里是输入数据框

+-----+-------------+----------+--------------+------+
|   id|   event_type|  location|fault_severity|source|
+-----+-------------+----------+--------------+------+
| 6597|event_type 11|location 1|            -1|  test|
| 8011|event_type 15|location 1|             0| train|
| 2597|event_type 15|location 1|            -1|  test|
| 5022|event_type 15|location 1|            -1|  test|
| 5022|event_type 11|location 1|            -1|  test|
| 6852|event_type 11|location 1|            -1|  test|
| 6852|event_type 15|location 1|            -1|  test|
| 5611|event_type 15|location 1|            -1|  test|
|14838|event_type 15|location 1|            -1|  test|
|14838|event_type 11|location 1|            -1|  test|
| 2588|event_type 15|location 1|             0| train|
| 2588|event_type 11|location 1|             0| train|
+-----+-------------+----------+--------------+------+

我想要以下输出。

 +--------------+------------+-----------+
 |              | event_type | PercTrain |
 +--------------+------------+-----------+
 |event_type 11 |   7888     | 0.388945  |
 |event_type 35 |   6615     | 0.407105  |
 |event_type 34 |   5927     | 0.406783  |
 |event_type 15 |   4395     | 0.392264  |
 |event_type 20 |   1458     | 0.382030  |
 +--------------+------------+-----------+

我已经尝试过此代码,但这会引发错误

    EventSet.withColumn("z" , when($"source" === "train" , sum($"source") / length($"source"))).groupBy("fault_severity").count().show()

这里的EventSet是输入数据框

提供所需输出的Python代码是

event_type_unq['PercTrain'] = event_type.pivot_table(values='source',index='event_type',aggfunc=lambda x: sum(x=='train')/float(len(x))) 

1 个答案:

答案 0 :(得分:1)

我想您想获得训练值的百分比。所以,这是我的代码,

val df2 = df.select($"event_type", $"source").groupBy($"event_type").pivot($"source").agg(count($"source")).withColumn("PercTrain", $"train" / ($"train" + $"test")).show

并给出如下结果:

+-------------+----+-----+------------------+
|   event_type|test|train|         PercTrain|
+-------------+----+-----+------------------+
|event_type 11|   4|    1|               0.2|
|event_type 15|   5|    2|0.2857142857142857|
+-------------+----+-----+------------------+

希望能有所帮助。