Python DataFrame按时差拆分会话的新列-熊猫
我有以下已排序的数据帧:Python DataFrame按时差拆分会话的新列-熊猫,python,pandas,partition,Python,Pandas,Partition,我有以下已排序的数据帧: import pandas as pd hits = {'id': ['A','A','A','A','B','B','C','C'], 'datetime': ['2010-01-02 03:00:00','2010-01-02 03:05:10','2010-01-02 03:51:35','2010-01-02 04:40:20', '2010-01-02 03:29:10','2010-01-02 03:
import pandas as pd
hits = {'id': ['A','A','A','A','B','B','C','C'],
'datetime': ['2010-01-02 03:00:00','2010-01-02 03:05:10','2010-01-02 03:51:35','2010-01-02 04:40:20',
'2010-01-02 03:29:10','2010-01-02 03:29:15','2010-01-02 03:45:20','2010-01-02 06:10:05'],
'value': [1,2,2,1,1,3,2,4]
}
df = pd.DataFrame(hits, columns = ['id', 'datetime','value'])
df['datetime'] = pd.to_datetime(df['datetime'], format='%Y-%m-%d %H:%M:%S')
print (df)
id datetime value
0 A 2010-01-02 03:00:00 1
1 A 2010-01-02 03:05:10 2
2 A 2010-01-02 03:51:35 2
3 A 2010-01-02 04:40:20 1
4 B 2010-01-02 03:29:10 1
5 B 2010-01-02 03:29:15 3
6 C 2010-01-02 03:45:20 2
7 C 2010-01-02 06:10:05 4
列id允许我区分不同的用户,但我想向前迈出一步,能够按会话对点击进行分组。一个会话定义为所有用户活动,不超过30分钟不活动
在我的数据帧中,所需的输出应为:
id datetime value session
0 A 2010-01-02 03:00:00 1 1
1 A 2010-01-02 03:05:10 2 1
2 A 2010-01-02 03:51:35 2 2
3 A 2010-01-02 04:40:20 1 3
4 B 2010-01-02 03:29:10 1 1
5 B 2010-01-02 03:29:15 3 1
6 C 2010-01-02 03:45:20 2 1
7 C 2010-01-02 06:10:05 4 2
在SQL中,我将首先使用lag来计算按id顺序按datetime asc划分的命中数之间的差异,然后在新的查询中,当diff>30min时,我将sumcase,然后1 else 0结束,也将按id划分
熊猫身上也有类似的东西吗?使用diff上的cumsum与阈值进行比较是一种常见的技术,用于识别由阈值分隔的块。比如:
series.diff().gt('30Min').cumsum()
由于要按id查找块,只需将其包装在groupby中:
输出:
id datetime value session
0 A 2010-01-02 03:00:00 1 0
1 A 2010-01-02 03:05:10 2 0
2 A 2010-01-02 03:51:35 2 1
3 A 2010-01-02 04:40:20 1 2
4 B 2010-01-02 03:29:10 1 0
5 B 2010-01-02 03:29:15 3 0
6 C 2010-01-02 03:45:20 2 0
7 C 2010-01-02 06:10:05 4 1
使用diff上的cumsum与阈值进行比较来识别由阈值分隔的块是一种常见的技术。比如:
series.diff().gt('30Min').cumsum()
由于要按id查找块,只需将其包装在groupby中:
输出:
id datetime value session
0 A 2010-01-02 03:00:00 1 0
1 A 2010-01-02 03:05:10 2 0
2 A 2010-01-02 03:51:35 2 1
3 A 2010-01-02 04:40:20 1 2
4 B 2010-01-02 03:29:10 1 0
5 B 2010-01-02 03:29:15 3 0
6 C 2010-01-02 03:45:20 2 0
7 C 2010-01-02 06:10:05 4 1
您可以进行双重分组。分组方式:
您可以在id上创建一个名为sthat use.groupby的布尔序列,如果大于30分钟,则为每个组中的每一行返回True或False。
然后,您可以再次根据在步骤1中创建的id进行分组,并使用.cumsum返回累积计数,然后添加1,以便从1开始计数,而不是从0开始计数
您可以进行双重分组。分组方式:
您可以在id上创建一个名为sthat use.groupby的布尔序列,如果大于30分钟,则为每个组中的每一行返回True或False。
然后,您可以再次根据在步骤1中创建的id进行分组,并使用.cumsum返回累积计数,然后添加1,以便从1开始计数,而不是从0开始计数
令人惊叹的只是一个附带的问题:你怎么知道30分钟的诀窍?我在中找不到它。@BillHuang不太记得我什么时候学的。@BillHuang这种语法与其他日期/时间操作类似,包括pd.gropper、.asfreq等。@DavidErickson pd.gropper.asfreq似乎也不存在于文档中。搜索datetime gt也给了我似乎不相关的结果。也许它曾经被记录在0.x版本中,但在1.x版本中被删除了?@BillHuang我使用了Grouper和.asfreq作为两个单独的例子。Grouper和.asfreq的官方文档在其文档中都包含以下链接:Min在该表中。然而,我看到了min,m,我相信几分钟也过去了。并非所有版本的pandas都接受每个字符串的变化,因为我记得在过去回答了一个stackoverflow问题,而我帮助的人有一个更老的版本。1分钟不起作用,但1分钟起作用。太棒了!只是一个附带的问题:你怎么知道30分钟的诀窍?我在中找不到它。@BillHuang不太记得我什么时候学的。@BillHuang这种语法与其他日期/时间操作类似,包括pd.gropper、.asfreq等。@DavidErickson pd.gropper.asfreq似乎也不存在于文档中。搜索datetime gt也给了我似乎不相关的结果。也许它曾经被记录在0.x版本中,但在1.x版本中被删除了?@BillHuang我使用了Grouper和.asfreq作为两个单独的例子。Grouper和.asfreq的官方文档在其文档中都包含以下链接:Min在该表中。然而,我看到了min,m,我相信几分钟也过去了。并非所有版本的pandas都接受每个字符串的变化,因为我记得在过去回答了一个stackoverflow问题,而我帮助的人有一个更老的版本。1分钟不起作用,但1分钟起作用。