Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.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 基于上一行的输出分配值_Python_Pandas_Dataframe - Fatal编程技术网

Python 基于上一行的输出分配值

Python 基于上一行的输出分配值,python,pandas,dataframe,Python,Pandas,Dataframe,我正在使用pandas分析应用程序的输出日志,并希望将每个条目分配到会话中。会话定义为从开始到结束的60分钟 下面是一个小例子: import numpy as np import pandas as pd from datetime import timedelta > df = pd.DataFrame({ 'time': [ pd.Timestamp(2019, 1, 1, 1, 10), pd.Timestamp(2019, 1, 1, 1

我正在使用pandas分析应用程序的输出日志,并希望将每个条目分配到会话中。会话定义为从开始到结束的60分钟

下面是一个小例子:

import numpy as np
import pandas as pd
from datetime import timedelta

> df = pd.DataFrame({
    'time': [
        pd.Timestamp(2019, 1, 1, 1, 10),
        pd.Timestamp(2019, 1, 1, 1, 15),
        pd.Timestamp(2019, 1, 1, 1, 20),
        pd.Timestamp(2019, 1, 1, 2, 20),
        pd.Timestamp(2019, 1, 1, 5, 0),
        pd.Timestamp(2019, 1, 1, 5, 15)
    ]
})

> df
                   time
0   2019-01-01 01:10:00
1   2019-01-01 01:15:00
2   2019-01-01 01:20:00
3   2019-01-01 02:20:00
4   2019-01-01 05:00:00
5   2019-01-01 05:15:00
对于第一行,
开始时间
等于
时间
。对于后续行,如果其
时间
在前一行的1小时之内,则认为它处于同一会话中。如果没有,它将使用
start\u time=time
启动一个新会话。我正在使用一个循环:

df['start_time'] = np.nan

for index in df.index:
    if index == 0:
        start_time = df['time'][index]
    else:
        delta = df['time'][index] - df['time'][index - 1]
        start_time = df['start_time'][index - 1] if delta.total_seconds() <= 3600 else df['time'][index]

    df['start_time'][index] = start_time

它工作起来很慢。有没有方法将其矢量化?

使用
diff
cumsum
创建组键,然后我们只需使用该键就可以首先获得每个组的

s=(df.time.diff()/np.timedelta64(1, 's')).gt(3600).cumsum()
df.groupby(s)['time'].transform('first')
Out[833]: 
0   2019-01-01 01:10:00
1   2019-01-01 01:10:00
2   2019-01-01 01:10:00
3   2019-01-01 01:10:00
4   2019-01-01 05:00:00
5   2019-01-01 05:00:00
Name: time, dtype: datetime64[ns]
df['statr_time']=df.groupby(s)['time'].transform('first')

我使用np-where、shift和cumsum来创建会话id,然后使用transform和min来获取开始时间

df['session_id'] = np.where((df['time'] - df['time'].shift(1)).astype('timedelta64[m]').fillna(0)>60,1,0).cumsum()
df['start_time'] = df.groupby(['session_id'])['time'].transform(min)

display(df)

    time    session_id  start_time
0   2019-01-01 01:10:00 0   2019-01-01 01:10:00
1   2019-01-01 01:15:00 0   2019-01-01 01:10:00
2   2019-01-01 01:20:00 0   2019-01-01 01:10:00
3   2019-01-01 02:20:00 0   2019-01-01 01:10:00
4   2019-01-01 05:00:00 1   2019-01-01 05:00:00
5   2019-01-01 05:15:00 1   2019-01-01 05:00:00

试着看看你的输出…我认为你很接近,但仍然没有回答这个问题我稍微改变了我的方法。。。这应该行得通。很抱歉搞混了。我想现在它和你的答案很相似。。。
df['session_id'] = np.where((df['time'] - df['time'].shift(1)).astype('timedelta64[m]').fillna(0)>60,1,0).cumsum()
df['start_time'] = df.groupby(['session_id'])['time'].transform(min)

display(df)

    time    session_id  start_time
0   2019-01-01 01:10:00 0   2019-01-01 01:10:00
1   2019-01-01 01:15:00 0   2019-01-01 01:10:00
2   2019-01-01 01:20:00 0   2019-01-01 01:10:00
3   2019-01-01 02:20:00 0   2019-01-01 01:10:00
4   2019-01-01 05:00:00 1   2019-01-01 05:00:00
5   2019-01-01 05:15:00 1   2019-01-01 05:00:00