我的项目中有一个特定的问题,需要根据多个列计算平均值。
由于我无法共享我的项目数据,所以我发布了一个示例问题,该示例具有与我的相似的约束。
我的数据框如下所示。
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
此数据捕获用户以不同的公里间隔花费的各种时间。现在,我想绘制一个折线图,该折线图表示各个时间间隔所花费的平均时间。下面是这样的。
我通过编程为每5公里范围创建一个存储桶,并剖析这些存储桶中的每一行条目并计算平均值,以编程方式解决了这个问题(到目前为止可能是蛮力的方式)。
但是,我认为这可能不是一个可扩展的解决方案,可以处理数百万个数据。
有人可以通过pandas或pyspark中定义的任何API帮助我吗?
答案 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|
+------+--------+------+----------------+-------------------+
然后,您可以使用获得的列来计算所需的内容。