根据熊猫或pyspark中两列的范围进行汇总

时间:2019-04-01 04:45:02

标签: pandas pyspark

我的项目中有一个特定的问题,需要根据多个列计算平均值。

由于我无法共享我的项目数据,所以我发布了一个示例问题,该示例具有与我的相似的约束。

我的数据框如下所示。

UserID      Start_KM    End_KM      Time_Taken(secs)
ABC         20          35          12
ABC         36          47          25
CDE         20          27          8
CDE         28          33          13
CDE         34          42          20
CDE         43          47          22      

此数据捕获用户以不同的公里间隔花费的各种时间。现在,我想绘制一个折线图,该折线图表示各个时间间隔所花费的平均时间。下面是这样的。 enter image description here

我通过编程为每5公里范围创建一个存储桶,并剖析这些存储桶中的每一行条目并计算平均值,以编程方式解决了这个问题(到目前为止可能是蛮力的方式)。

但是,我认为这可能不是一个可扩展的解决方案,可以处理数百万个数据。

有人可以通过pandas或pyspark中定义的任何API帮助我吗?

1 个答案:

答案 0 :(得分:2)

您可以使用pyspark.ml.feature中的功能Bucketizer

from pyspark.ml.feature import Bucketizer

df = sqlContext.createDataFrame([("ABC", 20, 35, 12),
                                 ("ABC", 36, 47, 25),
                                 ("CDE", 20, 27, 8 ),
                                 ("CDE", 28, 33, 13),
                                 ("CDE", 34, 42, 20),
                                 ("CDE", 43, 47, 22)],
                                ["UserID","Start_KM","End_KM","Time_Taken(secs)"])

df = df.withColumn("Time_Taken(secs)",f.col("Time_Taken(secs)").cast("double"))

bucketizer = Bucketizer(splits=[-float("inf"), 5., 10., 15., 20., 25., 30., float("inf")],inputCol="Time_Taken(secs)", outputCol="Time_Taken(buckets)")
bucketed = bucketizer.transform(df)
bucketed.show()
+------+--------+------+----------------+-------------------+
|UserID|Start_KM|End_KM|Time_Taken(secs)|Time_Taken(buckets)|
+------+--------+------+----------------+-------------------+
|   ABC|      20|    35|            12.0|                2.0|
|   ABC|      36|    47|            25.0|                5.0|
|   CDE|      20|    27|             8.0|                1.0|
|   CDE|      28|    33|            13.0|                2.0|
|   CDE|      34|    42|            20.0|                4.0|
|   CDE|      43|    47|            22.0|                4.0|
+------+--------+------+----------------+-------------------+

然后,您可以使用获得的列来计算所需的内容。