我有以下数据:
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/