/ *我认为我的问题与语言无关,但是如果有问题,我正在使用PySpark。 * /
我目前有两个Spark DataFrame:
一个具有每分钟心率的每分钟数据(每人每天1440行)的数据:
| Person | date | time | heartrate |
|--------+------------+-------+-----------|
| 1 | 2018-01-01 | 00:00 | 70 |
| 1 | 2018-01-01 | 00:01 | 72 |
| ... | ... | ... | ... |
| 4 | 2018-10-03 | 11:32 | 123 |
| ... | ... | ... | ... |
以及另一个包含每日元数据的每日数据(每人每天1行)的DataFrame,包括天的聚类结果,即人Y的哪个聚类天X落入: / p>
| Person | date | cluster | max_heartrate |
|--------+------------+---------+----------------|
| 1 | 2018-01-01 | 1 | 180 |
| 1 | 2018-01-02 | 4 | 166 |
| ... | ... | ... | ... |
| 4 | 2018-10-03 | 1 | 147 |
| ... | ... | ... | ... |
(请注意,聚类是每个人单独进行的,因此人1的聚类1与人2的聚类1无关。)
我现在想计算每个组和每个人的平均心率,即每个人获得不同的平均值。如果我有三个集群,那么我正在寻找这个DF:
| Person | cluster | mean_heartrate |
|--------+---------+----------------|
| 1 | 1 | 123 |
| 1 | 2 | 89 |
| 1 | 3 | 81 |
| 2 | 1 | 80 |
| ... | ... | ... |
如何最好地做到这一点?从概念上讲,我想每人将这两个两个数据帧分组,然后将两个DF块发送到apply函数中。在其中(即每人),我将每天的每日DF分组并汇总,然后加入每日DF的群集ID,然后计算每个群集的平均值。
但是无法对多个DF进行分组/应用,对吗?
我有两个想法,不确定哪一个有意义:
将每日DF加入到分组之前的每分钟DF ,这将导致高度冗余的数据(即每分钟复制一个集群ID)。在我的“真实”应用程序中,我可能还会有每人的数据(例如身高/体重),这将是一个完全恒定的列,即浪费更多的内存。也许那是唯一/最佳/公认的方式?
在应用之前,将DF转换为可以容纳复杂结构的DF,例如喜欢
。
| Person | dataframe | key | column | value |
|--------+------------+------------------+-----------+-------|
| 1 | heartrates | 2018-01-01 00:00 | heartrate | 70 |
| 1 | heartrates | 2018-01-01 00:01 | heartrate | 72 |
| ... | ... | ... | ... | ... |
| 1 | clusters | 2018-01-01 | cluster | 1 |
| ... | ... | ... | ... | ... |
甚至是
| Person | JSON |
|--------+--------|
| 1 | { ...} |
| 2 | { ...} |
| ... | ... |
这里的最佳做法是什么?
答案 0 :(得分:0)
但是无法对多个DF进行分组/应用,对吗?
不,AFAIK不适用于pyspark和pandas。
- 在分组之前将每日DF加入到每分钟DF中...
这是我认为的方法。您不需要合并所有冗余列,而只需合并组操作所需的列即可。无法避免您的groupby列出现冗余,因为groupby操作将需要它们。
在熊猫中,有可能专门提供一个额外的groupby列作为pandas系列,但它需要具有与要分组的数据框完全相同的形状。但是,要创建groupby列,仍然需要合并。
- 在应用之前,将DF转换为可以容纳复杂结构的DF
在性能和内存方面,除非您有多个必需的groupby操作,这些操作将从更复杂的数据结构中受益,否则我不会采用此解决方案。实际上,您首先需要付出一些努力才能真正创建数据结构。