Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python DataFrame按时差拆分会话的新列-熊猫_Python_Pandas_Partition - Fatal编程技术网

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分钟起作用。