将Pandas数据帧行划分为相似的基于时间的组

2024-05-19 10:54:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含马拉松比赛结果的数据帧,其中每一行代表一个跑步者,列包括诸如“开始时间”(timedelta)、“净时间”(timedelta)和地点(int)的数据。开始时间与净时间的散点图便于直观地识别比赛中不同的起跑栏(热):

Start time in seconds vs Net time in seconds

我想分别分析每种热量,但我想不出如何把它们分开。大约有两万名赛跑者参加比赛。开始时间间隔不一致,给定畜栏中的跑步者数量也不一致

我用来组织数据的代码要点: https://gist.github.com/kellbot/1bab3ae83d7b80ee382a

CSV,大约有500个结果: https://github.com/kellbot/raceresults/blob/master/Full/B.csv


Tags: 数据httpsgithubcom时间代表跑步直观
2条回答

如果我理解正确的话,你在问一种方法,把Start Num值聚合成不同的heat。这是一个一维分类/聚类问题。在

一个快速的解决方案是使用许多Jenks自然中断脚本中的一个。我以前用过德雷达的版本:

https://gist.github.com/drewda/1299198

通过对地块的考察,我们知道这里有16座。所以你可以预先选择类的数量为16。在

k = jenks.getJenksBreaks(full['Start Num'].tolist(),16)
ax = full.plot(kind='scatter', x='Start Num', y='Net Time Sec', figsize=(15,15))
[plt.axvline(x) for x in k]

从您的示例数据中,我们可以看到它做得很好,但是观察结果的稀疏性是否无法确定最小的起始Num bins之间的中断:

enter image description here

有很多方法可以做到这一点(包括用夏比的k-均值法),但简单的检查就可以清楚地看到,两次加热之间至少有60秒的间隔。所以我们需要做的就是对开始时间进行排序,找到60年代的间隙,每次我们找到一个间隙,就分配一个新的炉号。在

使用diff-compare-cumsum模式可以轻松完成:

starts = df["Start Time"].copy()
starts.sort()
dt = starts.diff()
heat = (dt > pd.Timedelta(seconds=60)).cumsum()
heat = heat.sort_index()

它正确地选取了16个(明显的)组,这里用炉号着色:

example of groups coloured by heat

相关问题 更多 >

    热门问题