获取按时间序列数据帧分组的最大时间



我有一个如下的数据帧:

Date                 User    Tag
2-22-2022 09:00:00   u1      a
2-22-2022 10:00:00   u1      b
2-22-2022 11:00:00   u2      c
2-23-2022 09:00:00   u1      a
2-23-2022 10:00:00   u2      b

希望为每个用户创建一个列,列中包含后续用户/记录之间的时间差。

类似于:

df["diff"] = df.groupby("user")["StartT"].diff().shift(-1)

Date                 User    Tag   diff
2-22-2022 09:00:00   u1      a      1 hour
2-22-2022 10:00:00   u1      b      23 hours
2-22-2022 11:00:00   u2      c      23 hours
2-23-2022 09:00:00   u1      a      NaN 
2-23-2022 10:00:00   u2      b      NaN

我想做的是,为每个用户(每天(和每个标签,获得用户在其中花费更多时间的标签

输出:

Date                 User    Tag
2-22-2022 10:00:00   u1      b
2-22-2022 11:00:00   u2      c
2-23-2022 09:00:00   u1      a
2-23-2022 10:00:00   u2      b

是否尝试groupby(user, date(1day), tag)['diff].sum().idxmax((?

每个用户每天可能有多个标签,这就是为什么我按标签进行分组

首先,我必须拆分您对"diff";列,以达到与您相同的输出:

>>> df["diff"] = df.groupby("User")["Date"].diff()
>>> df["diff"] = df.groupby("User")["diff"].shift(-1)

我们还将在";diff";列,方法是计算一天结束时的剩余小时数(在数据结束时很有用(。

>>> df["diff"] = df["diff"].fillna(df["Date"].dt.date + pd.DateOffset(days=1) - df["Date"])
>>> df
Date User Tag            diff
0 2022-02-22 09:00:00   u1   a 0 days 01:00:00
1 2022-02-22 10:00:00   u1   b 0 days 23:00:00
2 2022-02-22 11:00:00   u2   c 0 days 23:00:00
3 2022-02-23 09:00:00   u1   a 0 days 15:00:00
4 2022-02-23 10:00:00   u2   b 0 days 14:00:00

现在,我们将.groupby应用于通过";用户";,天(使用df["Date"].dt.date(;标记";以计算在每个";标记":

>>> times = pd.to_datetime(df["Date"])
>>> df_total_diff = df.dropna().groupby(["User", times.dt.date, "Tag"])["diff"].sum().reset_index()
>>> df_total_diff
User        Date Tag            diff
0   u1  2022-02-22   a 0 days 01:00:00
1   u1  2022-02-22   b 0 days 23:00:00
2   u1  2022-02-23   a 0 days 15:00:00
3   u2  2022-02-22   c 0 days 23:00:00
4   u2  2022-02-23   b 0 days 14:00:00

最后,我们可以通过";用户";以及";日期";以找到消耗最多的";标记":

>>> df_output = df.loc[df_total_diff.groupby(["User", "Date"])["diff"].idxmax()]
>>> df_output
Date User Tag
1 2022-02-22 10:00:00   u1   b
2 2022-02-22 11:00:00   u2   c
3 2022-02-23 09:00:00   u1   a
4 2022-02-23 10:00:00   u2   b

最新更新