我有一个包含 2 列的 df。一个是以微秒为单位的时间戳,另一个是一个值。它看起来像这样: time score 83620 4 83621 4 83622 4 83623 4 83624 4 83625 4 83626 4 83627 4 83628 4 83629 4 83630 4 83631 4 83632 4 83633 5 83634 5 83635 5 83636 5 83637 5 83638 5 83639 6 83640 1 83641 1 83642 4我想将 df.time 协调到毫秒并按模式聚合 df.score。它应该是这样的: time score 8362 4 8363 5 8364 1
3 回答
天涯尽头无女友
TA贡献1831条经验 获得超9个赞
尝试:
df.groupby(df['time'] // 10)['score'].apply(lambda x: x.mode()[0])
输出:
time
8362 4
8363 5
8364 1
Name: score, dtype: int64
Smart猫小萌
TA贡献1911条经验 获得超7个赞
首先,转换时间列,使其包含毫秒。1 微秒包含 0.001 毫秒。因此,此代码会将您的时间列转换为毫秒:
df['time'] = df['time'] / 1000
然后,按所需的列分组,在本例中为分数,然后指定您是按模式聚合的时间列。这可以使用以下代码完成:
df.groupby(['score']).apply(pd.DataFrame.mode).reset_index(drop=True)
万千封印
TA贡献1891条经验 获得超3个赞
两种方法:
使用resample,不过今天才知道,目前还没有尝试过,不过看起来很强大。
我最喜欢的方法是:
df["milliseconds"] = np.round(df["time"] / 1000, 0) # For cutoff, consider // 1000 df = df.groupby("milliseconds").agg(score=("score", "mode")).reset_index()
如果时间紧迫,请考虑使用 .apply() 或列表理解进行毫秒计算。如果您使用 apply 执行此操作,请记住 lambda 函数有开销。对于非常大的样本,numpy 可能会稍微快一些。重新采样可能比分组更快,但这很容易。
添加回答
举报
0/150
提交
取消