Агрегирование на основе диапазона из двух столбцов в пандах или pyspark - PullRequest
1 голос
/ 01 апреля 2019

У меня есть конкретная проблема в моем проекте, которая требует вычисления среднего значения по нескольким столбцам.

Поскольку я не могу поделиться данными своего проекта, я опубликовал пример проблемы, которая имеет ограничения, аналогичные моим.

Мой фрейм данных выглядит следующим образом.

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-километрового диапазона, разбивая каждую запись ряда в эти интервалы и вычисляя среднее значение.

Однако я считаю, что для миллионов данных это не может быть масштабируемым решением.

Может ли кто-нибудь помочь мне с какими-либо API-интерфейсами, определенными в pandas или pyspark, которые могут помочь мне в этом случае проще?

1 Ответ

2 голосов
/ 08 апреля 2019

Вы можете использовать функцию Bucketizer из pyspark.ml.feature

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|
+------+--------+------+----------------+-------------------+

Затем вы можете использовать полученный столбец для расчета того, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...