我有一个如下的数据帧:
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