Python 如何在pandas中使用lead in days添加标识符列?

Python 如何在pandas中使用lead in days添加标识符列?,python,pandas,Python,Pandas,我有以下表格: name date_time jon 10/01/2019 jon 11/01/2019 jon 12/01/2019 jon 25/01/2019 sam 03/04/2019 sam 18/04/2019 sam 19/04/2019 sam 29/04/2019 fred 02/02/2019 fred 03/02/2019 fred 12/02/2019 fred 13/02/2019 pandas中的列类型为-name为string,date_time

我有以下表格:

name date_time
jon  10/01/2019
jon  11/01/2019
jon  12/01/2019
jon  25/01/2019
sam  03/04/2019
sam  18/04/2019
sam  19/04/2019
sam  29/04/2019
fred 02/02/2019
fred 03/02/2019
fred 12/02/2019
fred 13/02/2019
pandas中的列类型为-name为string,date_time为datetime64[ns,UTC]格式

我想创建一个新的列,它允许我根据每个用户在数据中出现的日期来确定用户是在一个“会话”中还是在另一个“会话”中

“会话”是用户首次记录日期\时间值的前10天,前10天之后的任何内容都是另一个“会话”

它并不意味着每10天就有一个新的标识符,它意味着只需要制作两个标识符——一个用于从第一个日期时间值开始的前10天,另一个用于从第11天开始的前10天

我希望使这些会话值是唯一的,并且与人的姓名相关-我可能会使用一些字符串连接来完成,但应该是这样的:

name date_time  session_identifier
jon  10/01/2019 jon_session_1_id
jon  11/01/2019 jon_session_1_id
jon  12/01/2019 jon_session_1_id
jon  25/01/2019 jon_session_2_id
sam  03/04/2019 sam_session_1_id
sam  18/04/2019 sam_session_2_id
sam  19/04/2019 sam_session_2_id
sam  29/04/2019 sam_session_2_id
fred 02/02/2019 fred_session_1_id
fred 03/02/2019 fred_session_1_id
fred 12/02/2019 fred_session_2_id
fred 13/02/2019 fred_session_2_id
例如,它应该是这样的:

name date_time  session_identifier
jon  10/01/2019 jon_session_1_id
jon  11/01/2019 jon_session_1_id
jon  12/01/2019 jon_session_1_id
jon  25/01/2019 jon_session_2_id
sam  03/04/2019 sam_session_1_id
sam  18/04/2019 sam_session_2_id
sam  19/04/2019 sam_session_2_id
sam  29/04/2019 sam_session_2_id
fred 02/02/2019 fred_session_1_id
fred 03/02/2019 fred_session_1_id
fred 12/02/2019 fred_session_2_id
fred 13/02/2019 fred_session_2_id
如您所见,以用户jon的第一个示例为例:

我想在这里创建一个标识符(我称之为jon_session_1_id),从第一个日期时间值(即2019年1月10日)开始的10天内重复该标识符,因此jon_session_1_id将作为会话标识符重复到2019年1月20日,然后它将更改为jon_session_2_id

每个会话id都与该人员的姓名相关


如何在Python中实现这一点?我理解,当/switch语句基于使用lead函数时,实际上应该是这样,但不确定从何处开始。

您可以通过一些步骤来跟踪计算

首先,您可以创建一个按用户初始化为最小日期值的列,以及一个“持续时间”列,用于区分“当前日期”(当前行)和“按用户初始化的最小日期”列

创建此列后,您基本上可以创建另一列,只需检查“持续时间”是否小于10,否则为0,否则为1


然后,您可以将所需内容连接为字符串输出。

您可以通过一些步骤来跟踪计算

首先,您可以创建一个按用户初始化为最小日期值的列,以及一个“持续时间”列,用于区分“当前日期”(当前行)和“按用户初始化的最小日期”列

创建此列后,您基本上可以创建另一列,只需检查“持续时间”是否小于10,否则为0,否则为1

然后,您可以将所需内容连接为字符串输出。

您可以使用以下方法:

您可以使用以下方法:


您可以找到累积差异并应用
lambda
。示例代码如下所示

df=pd.DataFrame({
‘姓名’:(‘jon’、‘jon’、‘jon’、‘jon’、‘sam’、‘sam’、‘sam’、‘sam’、‘sam’、‘fred’、‘fred’、‘fred’、‘fred’),
“日期和时间”:[datetime.strTime(d,'%d/%m/%Y')表示日期和时间(2019年1月10日、2019年1月11日、2019年1月12日、2019年1月25日、2019年4月3日、2019年4月18日、2019年4月19日、2019年4月29日、2019年2月2日、2019年2月3日、2019年2月12日、2019年2月13日)]
})
df=df[['name','date\u time']]
df=df.sort_值(['name','date_time']))
df['diff']=df.groupby(['name'])['date\u time'].transform(lambda x:x.diff().dt.days)
df=df.groupby(['name','date\u time']).sum().groupby('name').cumsum().reset\u index()
df['session_identifier']=df.apply(lambda行:行['name']+''u session_'+str(如果行['diff']>10,则为2,否则为1)+''u id',axis=1)
df
输出为

    name    date_time   diffs   session_identifier
0   fred    2019-02-02  0.0     fred_session_1_id
1   fred    2019-02-03  1.0     fred_session_1_id
2   fred    2019-02-12  10.0    fred_session_1_id
3   fred    2019-02-13  11.0    fred_session_2_id
4   jon     2019-01-10  0.0     jon_session_1_id
5   jon     2019-01-11  1.0     jon_session_1_id
6   jon     2019-01-12  2.0     jon_session_1_id
7   jon     2019-01-25  15.0    jon_session_2_id
8   sam     2019-04-03  0.0     sam_session_1_id
9   sam     2019-04-18  15.0    sam_session_2_id
10  sam     2019-04-19  16.0    sam_session_2_id
11  sam     2019-04-29  26.0    sam_session_2_id

您可以找到累积差异并应用
lambda
。示例代码如下所示

df=pd.DataFrame({
‘姓名’:(‘jon’、‘jon’、‘jon’、‘jon’、‘sam’、‘sam’、‘sam’、‘sam’、‘sam’、‘fred’、‘fred’、‘fred’、‘fred’),
“日期和时间”:[datetime.strTime(d,'%d/%m/%Y')表示日期和时间(2019年1月10日、2019年1月11日、2019年1月12日、2019年1月25日、2019年4月3日、2019年4月18日、2019年4月19日、2019年4月29日、2019年2月2日、2019年2月3日、2019年2月12日、2019年2月13日)]
})
df=df[['name','date\u time']]
df=df.sort_值(['name','date_time']))
df['diff']=df.groupby(['name'])['date\u time'].transform(lambda x:x.diff().dt.days)
df=df.groupby(['name','date\u time']).sum().groupby('name').cumsum().reset\u index()
df['session_identifier']=df.apply(lambda行:行['name']+''u session_'+str(如果行['diff']>10,则为2,否则为1)+''u id',axis=1)
df
输出为

    name    date_time   diffs   session_identifier
0   fred    2019-02-02  0.0     fred_session_1_id
1   fred    2019-02-03  1.0     fred_session_1_id
2   fred    2019-02-12  10.0    fred_session_1_id
3   fred    2019-02-13  11.0    fred_session_2_id
4   jon     2019-01-10  0.0     jon_session_1_id
5   jon     2019-01-11  1.0     jon_session_1_id
6   jon     2019-01-12  2.0     jon_session_1_id
7   jon     2019-01-25  15.0    jon_session_2_id
8   sam     2019-04-03  0.0     sam_session_1_id
9   sam     2019-04-18  15.0    sam_session_2_id
10  sam     2019-04-19  16.0    sam_session_2_id
11  sam     2019-04-29  26.0    sam_session_2_id

谢谢你打破了步骤-我会有一个裂缝,并张贴一些代码,一旦我能够解决它-应该很快!谢谢你打破了步骤-我会有一个裂缝,并张贴一些代码,一旦我能够解决它-应该很快!这实际上并没有回答我的问题-你是在考虑累计差异-我希望在日期中确定一个锚定点,作为已发生的最小日期,并计算这些日期的差异,而不是每个人的最小日期或整个人的一个最小日期?每个人的一个最小日期-因此按姓名分组-比如Jon-他的最短日期是2019-01-10,第一个标识符-jon_session_1_id基本上应该从2019-01-10运行到2019-01-20-然后job_session_2_id将从2019-01-21运行-这有帮助吗?这实际上并没有回答我的问题-你是在考虑累积差异-我希望在日期中确定一个锚定点,作为已发生的最小日期计算每个人的这些替代最小日期或整个人的一个最小日期的日期差?每个人的一个最小日期-按姓名分组-比如Jon-他的最小日期是2019-01-10,第一个标识符-jon_session_1_id基本上应该从2019-01-10运行到2019-01-20-然后job_session_2_id将从2019-01-21运行-这有帮助吗?