我有以下数据:
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()