gpt4 book ai didi

python - Pandas - groupby 具有另一列条件的列

转载 作者:太空狗 更新时间:2023-10-29 21:36:02 27 4
gpt4 key购买 nike

关于如何根据条件对多个列值进行分组,我正在与 pandas 作斗争:

这是我的数据作为 pandas 数据框的样子:

id      trigger     timestamp
1 started 2017-10-01 14:00:1
1 ended 2017-10-04 12:00:1
2 started 2017-10-02 10:00:1
1 started 2017-10-03 11:00:1
2 ended 2017-10-04 12:00:1
2 started 2017-10-05 15:00:1
1 ended 2017-10-05 16:00:1
2 ended 2017-10-05 17:00:1

我的目标是找出按 id 分组的日期之间的天/小时或分钟差异。

我的输出应该更像这样(以小时为单位的差异):

id      trigger     timestamp           trigger     timestamp               diff
1 started 2017-10-01 14:00:1 ended 2017-10-04 12:00:1 70
1 started 2017-10-03 11:00:1 ended 2017-10-05 16:00:1 53
2 started 2017-10-02 10:00:1 ended 2017-10-04 12:00:1 26
2 started 2017-10-05 15:00:1 ended 2017-10-05 17:00:1 2

我尝试了很多选择,但我找不到最有效的解决方案。

到目前为止,这是我的代码:

首先,我尝试将数据拆分为“开始”和“结束”:

df['started'] = df.groupby(['id', 'timestamp'])['trigger'] == 'started'

df['ended'] = df.groupby(['id', 'timestamp'])['trigger'] == 'ended'

然后:

df.groupby(['id', 'started', 'ended'], as_index=True).sum()

但是没用。或

df['started'] = df.groupby(['trigger'])['timestamp'].np.where(df['trigger']=='started')

也没有直觉结果。

可以指出正确的方向如何用 Pandas 做到这一点吗?我还将在数据中进行空匹配,如何使用 df.fillna(method='ffill') 将 NaN 或缺失数据添加到新数据帧。

最佳答案

  1. 设置idtrigger为索引
  2. 由于索引包含重复的条目,请使用分组 cumcount 附加另一个索引列。总的来说,df 必须有一个包含 3 列的 MultiIndex
  3. unstack 时间戳
  4. 按小时计算各列之间的差异并将结果分配回去

df['timestamp'] = pd.to_datetime(df['timestamp']) # if necessary

i = df.groupby(['id', 'trigger']).cumcount()
df.set_index(['id', i, 'trigger']).timestamp.unstack().assign(
diff=lambda d: d.ended.sub(d.started).dt.total_seconds() / 3600
)

感谢 piRSquared 的改进。

v

timestamp diff
trigger ended started
id
1 0 2017-10-04 12:00:01 2017-10-01 14:00:01 70.0
1 2017-10-05 16:00:01 2017-10-03 11:00:01 53.0
2 0 2017-10-04 12:00:01 2017-10-02 10:00:01 50.0
1 2017-10-05 17:00:01 2017-10-05 15:00:01 2.0

结果与您的问题中描述的不完全相同,但我相信列的 MultiIndex 将是一种更清晰的表示输出的方式,而不是两个触发列。

关于python - Pandas - groupby 具有另一列条件的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48875828/

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