我有一个数据框架,看起来像这样:
id ts factor
A 2020-01-01 1
A 2020-01-02 1
A 2020-01-03 1
A 2020-01-04 1
A 2020-01-05 1
A 2020-01-06 10
A 2020-01-07 10
A 2020-01-08 10
A 2020-01-09 10
A 2020-01-10 10
A 2020-01-11 10
A 2020-01-12 10
A 2020-01-13 10
A 2020-01-14 10
A 2020-01-15 10
A 2020-01-16 10
A 2020-01-17 10
A 2020-01-18 1
A 2020-01-19 1
A 2020-01-20 1
我想要的输出是:
id start_ts end_ts factor
A 2020-01-01 2020-01-05 1
A 2020-01-06 2020-01-17 10
A 2020-01-18 2020-01-20 1
到目前为止,我只能考虑对因子进行分组,然后进行最小和最大操作,但这不适用于因子1
df.groupby(["factor"]).agg({'date' : [np.min, np.max]})
如何实现输出?
用cumsum
比较factor
的移位,找到factor
块,然后加到groupby
:
blocks = df['factor'].ne(df['factor'].shift()).cumsum()
df.groupby(['id','factor',blocks], sort=False)['ts'].agg(['min','max'])
输出:
min max
id factor factor
A 1 1 2020-01-01 2020-01-05
10 2 2020-01-06 2020-01-17
1 3 2020-01-18 2020-01-20
@Quang Hoang的稍微更新版本,命名分组:
blocks = df['factor'].ne(df['factor'].shift()).cumsum()
blocks = blocks.rename("group")
df2 = df.groupby(['id', blocks,'factor']).agg(
start_ts=('ts', 'min'),
end_ts=('ts', 'max'))
.reset_index()
.drop("group", axis=1)
:
print(df2)
id factor start_ts end_ts
0 A 1 2020-01-01 2020-01-05
1 A 10 2020-01-06 2020-01-17
2 A 1 2020-01-18 2020-01-20