如何将一列中的微秒转换为毫秒,并将另一列的聚合模式转换为毫秒

2024-04-26 23:52:48 发布

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

我有一个有两列的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条回答

首先,转换时间列,使其包含毫秒。1微秒包含0.001毫秒。因此,此代码将时间列转换为毫秒:

df['time'] = df['time'] / 1000

然后,按所需列分组,在本例中为score,然后指定按模式聚合时间列。这可以使用以下代码完成:

df.groupby(['score']).apply(pd.DataFrame.mode).reset_index(drop=True)

两种方法:

  1. 使用重采样,但我今天才了解它,到目前为止还没有尝试过,但它看起来很强大。 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.resample.html

  2. 我最喜欢的方法是:

df["milliseconds"] = np.round(df["time"] / 1000, 0) # For cutoff, consider // 1000
df = df.groupby("milliseconds").agg(score=("score", "mode")).reset_index()

如果时间紧迫,请考虑用Apple()或列表理解进行毫秒计算。如果使用apply,请记住lambda函数有开销。 对于非常大的样本,numpy可能会稍微快一点。 重采样可能比分组快,但这很容易

尝试:

df.groupby(df['time'] // 10)['score'].apply(lambda x: x.mode()[0])

输出:

time
8362    4
8363    5
8364    1
Name: score, dtype: int64

相关问题 更多 >