Python:从分组数据中提取平均值和时间信息



我有以下数据:

cluster    col1        col2        timestamp
0   1      34.000000    89.320000   2021-07-13 21:15:11.232
1   1      97.540001    29.000000   2021-06-13 14:22:11.682
2   3      NaN          1.030000    2021-04-01 10:10:45.623
3   1      NaN          22.670000   2021-06-13 10:54:00.329
4   1      92.339996    NaN         2021-05-13 13:12:01.000
5   2      43.200001    22.450001   2021-03-02 17:05:02.342
6   2      NaN          45.000000   2021-06-13 14:17:11.454
7   2      92.230003    10.000000   2021-06-13 11:22:11.311
8   3      13.000000    1.320000    2021-06-13 18:22:11.324

要按集群分组并按时间顺序设置,我需要:

df_grouped = df.groupby("cluster").apply(lambda x: x.sort_values(by = "timestamp"))

我的目标是计算每个集群的col1和col2的平均值,并提取最早和最晚的时间。换句话说,我想要以下输出:

cluster    col1_mean    col2_mean   start_time              end_time
0   1          74.626666    46.996667   2021-05-13 13:12:01.000 2021-07-13 21:15:11.232
1   2          67.715002    25.816667   2021-03-02 17:05:02.342 2021-06-13 14:17:11.454
2   3          13.0         1.175       2021-04-01 10:10:45.623 2021-06-13 18:22:11.324

然而,时间戳给我带来了一些麻烦,因为我不知道如何计算列的平均值并提取时间。

当时间戳被排除时,我可以通过以下操作计算集群的平均值:

df_excluding_time.groupby("cluster").mean()
>>
col1    col2
cluster     
1   74.626663   46.996666
2   67.715004   25.816668
3   13.000000   1.175000

实现我目标的最佳方法是什么?

您可以在groupby对象上使用agg函数。

df_grouped = df.sort_values(['cluster','timestamp']).groupby("cluster").agg({'col1':'mean', 'col2':'mean', 'timestamp':['first', 'last']})

那么您的列索引将是一个多索引[('col1','mean'),('col2','mean'),('timestamp','first'), ('timestamp','last')]。要把它放在你想要的格式,你可以手动做

df_grouped.columns = ['col1_mean','col2_mean','start_time','end_time']

最后,如果您希望集群列是列而不是索引,只需执行

df_grouped = df_grouped.reset_index()

最新更新