gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:08:05 25 4
gpt4 key购买 nike

我有以下 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 是字符串,date_time 是 datetime64[ns, UTC] 格式

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

“ session ”是用户首次记录 date_time 值的前 10 天,前 10 天之后的任何内容都是另一个“ session ”。

这并不意味着每 10 天一个新标识符,这意味着只需要制作 2 个标识符 - 一个用于从第一个 date_time 值开始的前 10 天,一个从第 11 天开始。

我想让这些 session 值是唯一的并且相对于人的名字 - 我可能会使用一些字符串连接来完成它但它应该是这样的:

例如它应该看起来像这样:

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),这在从第一个 date_time 值开始的 10 天内重复 - 这是 10/01/2019 所以 jon_session_1_id 将作为 session_identifier 重复直到20/01/2019 然后它将更改为 jon_session_2_id。

每个 session_id 都与人名相关。

这在 Python 中如何完成?我知道这应该是基于使用引导函数的 when/switch 语句的情况 - 但不确定从哪里开始。

最佳答案

您可能会发现累积差异并应用 lambda。示例代码如下

df = pd.DataFrame({
'name' : ('jon','jon','jon','jon','sam','sam','sam','sam','fred','fred','fred','fred'),
'date_time' : [datetime.strptime(d, '%d/%m/%Y') for d in ('10/01/2019', '11/01/2019', '12/01/2019', '25/01/2019', '03/04/2019', '18/04/2019', '19/04/2019', '29/04/2019', '02/02/2019', '03/02/2019', '12/02/2019', '13/02/2019')]
})
df = df[['name', 'date_time']]
df = df.sort_values(['name', 'date_time'])
df['diffs'] = df.groupby(['name'])['date_time'].transform(lambda x: x.diff().dt.days)
df = df.groupby(['name','date_time']).sum().groupby('name').cumsum().reset_index()
df['session_identifier'] = df.apply(lambda row : row['name'] + '_session_' + str(2 if row['diffs'] > 10 else 1) + '_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

关于python - 如何在 pandas 中使用 lead in days 添加标识符列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58916619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com