在具有约束的数据帧列中查找百分比



我有一个由位置、类型和日期组成的数据框。

d1=sc.parallelize([('a','b1','2015-01-07'), ('a','b2','2015-02-09'),
              ('c', 'b25', '2014-12-01'),('a','b2','2014-09-10'),
              ('c', 'b3','2015-02-21'),('a','b11','2015-09-12'),
              ('a','b7','2014-11-30'), ('c','b26','2014-03-09'),
              ('c', 'b30', '2015-11-28'),('a', 'b5', '2015-03-01'),
              ('c','b25','2015-11-29'),('c', 'b27','2014-01-17'),
              ('c', 'b16','2015-04-01'), ('a', 'b11','2014-01-19'),
              ('a','b7', '2015-09-29'), ('c', 'b12', '2014-08-20')]).toDF(['location',
                'type', 'date_str'])
d2=d1.withColumn('date',d1.date_str.cast('date')).drop('date_str')

|loaction|type|      date|
+--------+----+----------+
|       a|  b1|2015-01-07|
|       a|  b2|2015-02-09|
|       c| b25|2014-12-01|
|       a|  b2|2014-09-10|
|       c|  b3|2015-02-21|
|       a| b11|2015-09-12|
|       a|  b7|2014-11-30|
|       c| b26|2014-03-09|
|       c| b30|2015-11-28|
|       a|  b5|2015-03-01|
|       c| b25|2015-11-29|
|       c| b27|2014-01-17|
|       c| b16|2015-04-01|
|       a| b11|2014-01-19|
|       a|  b7|2015-09-29|
|       c| b12|2014-08-20|
+--------+----+----------+
我想获取 2014 年给定位置

的类型百分比,这些类型在 2015 年也出现在同一位置。

在这种情况下,2014 年位置"a"中有 3 种不同的类型,B2、B7 和 B11。2015年有5种不同的类型位置"A"、B1、B2、B11、B5 和 B7。所以在三种类型中脱颖而出谁在2014年,这三个也在2015年,即100%(3中的3)2015年。

对于位置"c",2014 年有四种类型,b25、b26、b27 和 b12。2015年有三种类型的b30,b25,b16。2014年类型数量2015年也出现过25%的人(4人中有1人)。

我正在尝试取回如下所示的数据帧

|location|percent_retained|
+--------+----------------+
|       a|               1|
|       c|             .25|
+--------+----------------+

我可以做一个 groupBy 来获取每年的原始计数,但这无济于事,因为我只想知道 2015 年也出现在 2014 年的类型数量。

d2=d2.withColumn('year', F.year(d2.date))
d2.groupBy('location', 'year').agg('type':'count')

我使用的是 Spark 1.5,因此无法透视数据帧。

像你一样提取年份,然后按locationtype分组。然后,您可以映射年份列表(每个位置,每个类型)并应用所需的逻辑。

据我所知,你可以有一年,也可以两年。您可以将其转换为"保留","just-2014","just-2015"之类的标志,然后从那里进行其余的计算。

最新更新