python - Pandas:将开始/结束事件分组为间隔

标签 python pandas dataframe group-by

我有以下数据:

import pandas as pd

df = pd.DataFrame({
    "id": [1,1,1,2,1,2],
    "datetime": [
        pd.to_datetime("2020-01-01"),
        pd.to_datetime("2020-01-02"),
        pd.to_datetime("2020-01-03"),
        pd.to_datetime("2020-01-04"),
        pd.to_datetime("2020-01-04"),
        pd.to_datetime("2020-01-06"),
        ],
    "type": [
        "start",
        "end",
        "start",
        "start",
        "end",
        "end"
    ]
})

看起来像这样

    pid datetime    type
0   1   2020-01-01  start
1   1   2020-01-02  end
2   1   2020-01-03  start
3   2   2020-01-04  start
4   1   2020-01-04  end
5   2   2020-01-06  end

我想以一种方式对它们进行分组,即对于每个 pid,开始日期和最近结束日期的组合都分组在一行中。请注意,每个 pid 可能会出现多次。所以期望的结果是:

pid  start_date  end_date
1   2020-01-01  2020-01-02
1   2020-01-03  2020-01-04
2   2020-01-04  2020-01-06

我想到的第一个方法是循环并执行逐元素匹配,但这对我来说似乎效率很低。特别是因为数据帧有 >1m 的条目。 接下来是 pandas groupby,但我找不到任何类似的用例。

是否有更有效的方法来对我所描述的数据进行分组?

最佳答案

一个想法是通过 GroupBy.cumcount 创建计数器然后使用 DataFrame.pivot :

df['g'] = df.groupby('type').cumcount()

df = (df.pivot(['g','id'], 'type','datetime')[['start','end']]
        .add_suffix('_date')
        .reset_index(level=0, drop=True))
print (df)
type start_date   end_date
id                        
1    2020-01-01 2020-01-02
1    2020-01-03 2020-01-04
2    2020-01-04 2020-01-06

关于python - Pandas:将开始/结束事件分组为间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69535930/

相关文章:

python - 使用 dataframe.shift() 时 Pandas 表现得很奇怪

Pandas 基于其他列向列多索引添加新的二级列

python - Pandas 无法对数据框求和

python - 使用 Python 创建并保存战舰游戏的文本文件

python - 用字符串填充空列表元素python

python - 添加数据框中行批处理的总和

python - matplotlib "axis.invert_xaxis"使用日期时间时崩溃

python - 在 Pandas 中展开矩阵

python - 函数定义后将返回对象赋值给函数名的目的

Python 锁定临界区