我必须将具有多个参与者的数据集分组。参与者在特定的平板电脑上工作特定的时间。如果行是同一平板电脑,并且连续行之间的时间差不超过10分钟,则这些行属于一个参与者。我想创建一个新列(“参与者”),为参与者编号。我知道一些python,但这让我感到头疼。非常感谢!
数据框:
ID, Time, Tablet
1, 9:12, a
2, 9:14, a
3, 9:17, a
4, 9:45, a
5, 9:49, a
6, 9:51, a
7, 9:13, b
8, 9:15, b
...
目标:
ID, Time, Tablet, Participant
1, 9:12, a, 1
2, 9:14, a, 1
3, 9:17, a, 1
4, 9:45, a, 2
5, 9:49, a, 2
6, 9:51, a, 2
7, 9:13, b, 3
8, 9:15, b, 3
...
答案 0 :(得分:0)
我之前做过类似的事情,我使用了group_by语句和Pandas shift函数的组合。
df = df.sort_values(["Tablet", "Time"])
df["Time_Period"] = df.groupby("Tablet")["Time"].shift(-1)-df["Time"]
df["Time_Period"] = df["Time_Period"].dt.total_seconds()
df["New_Participant"] = df["Time_Period"] > 10*60 #10 Minutes
df["Participant_ID"] = df["New_Participant"].cumsum()
基本上,我会在每次会话之间的间隔超过10分钟时进行标记,然后进行滚动汇总以为每个参与者提供唯一的ID
答案 1 :(得分:0)
您可以先进行groupby,然后进行总计以所需的方式获取参与者列。请确保时间列为日期时间格式,并对其进行排序。
df['time'] = pd.to_datetime(df['time'])
df['time_diff']=df.groupby(['tablet'])['time'].diff().dt.seconds/60
df['participant'] = np.where((df['time_diff'].isnull()) | (df['time_diff']>10), 1,0).cumsum()