gpt4 book ai didi

python - 仅根据分组记录计算 pandas 数据框中的新列

转载 作者:行者123 更新时间:2023-11-30 22:35:32 25 4
gpt4 key购买 nike

我有一个包含各种事件(id)和以下结构的数据框,df按id分组并按时间戳排序:

id | timestamp | A | B
1 | 02-05-2016|bla|bla
1 | 04-05-2016|bla|bla
1 | 05-05-2016|bla|bla
2 | 11-02-2015|bla|bla
2 | 14-02-2015|bla|bla
2 | 18-02-2015|bla|bla
2 | 31-03-2015|bla|bla
3 | 02-08-2016|bla|bla
3 | 07-08-2016|bla|bla
3 | 27-09-2016|bla|bla

每个 timestamp-id 组合表示具有该特定 id 的事件过程中的不同阶段。特定 id 的每个新记录都表示该事件 ID 的新阶段的开始。

我想添加一个新列持续时间,用于计算每个事件每个阶段的持续时间(请参阅下面所需的 df)。这很简单,因为我可以简单地计算同一事件 id 的下一阶段的时间戳与当前阶段的时间戳之间的差异,如下所示:

df['Start'] = pd.to_datetime(df['timestamp'])
df['End'] = pd.to_datetime(df['timestamp'].shift(-1))
df['Duration'] = df['End'] - df['Start']

我的问题出现在每个事件 ID 的最后一个阶段,因为我想简单地显示 NaN 或破折号,因为该阶段尚未完成且结束时间未知。我的解决方案只是采用下一行的时间戳,该时间戳并不总是正确的,因为它可能属于完全不同的事件。

期望的输出:

id | timestamp | A | B | Duration
1 | 02-05-2016|bla|bla| 2 days
1 | 04-05-2016|bla|bla| 1 days
1 | 05-05-2016|bla|bla| ------
2 | 11-02-2015|bla|bla| 3 days
2 | 14-02-2015|bla|bla| 4 days
2 | 18-02-2015|bla|bla| 41 days
2 | 31-03-2015|bla|bla| -------
3 | 02-08-2016|bla|bla| 5 days
3 | 07-08-2016|bla|bla| 50 days
3 | 27-09-2016|bla|bla| -------

最佳答案

我认为这符合你的要求:

df['timestamp'] = pd.to_datetime(df['timestamp'])
df['Duration'] = df.groupby('id')['timestamp'].diff().shift(-1)

如果我理解正确的话:groupby('id') 告诉 pandas 将 .diff().shift(-1) 应用于每个组,就好像它是独立于其他行的微型 DataFrame 一样。我用这个假数据测试了它:

import pandas as pd
import numpy as np

# Generate some fake data
df = pd.DataFrame()
df['id'] = [1]*5 + [2]*3 + [3]*4
df['timestamp'] = pd.to_datetime('2017-01-1')
duration = sorted(np.random.randint(30,size=len(df)))
df['timestamp'] += pd.to_timedelta(duration)
df['A'] = 'spam'
df['B'] = 'eggs'

但请仔细检查以确保我没有犯错误!

关于python - 仅根据分组记录计算 pandas 数据框中的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44549148/

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