使用基于列的条件滚动 windows?

Rolling windows with column based condition?

如何根据 resume 列加入行?
我的意思是,继续加入行,直到在 resume 列中有一个 1.
对于连接的行,我想为每一列使用一个聚合函数,就像这样:

{ 'tunein': 'first', 'tuneout': 'last', 'watching(minute)': 'sum' }

示例:来自此数据框

  account_id    asset_id     tunein      tuneout resume watching(minute)
1   61745         2967      12:42:00    13:01:00    0   19.0
2   61745         2967      15:48:00    15:51:00    1   3.0
3   61745         2967      15:52:00    15:56:00    1   4.0
4   61745         2967      15:57:00    16:23:00    0   26.0
5   61745         2967      21:06:00    21:10:00    0   4.0
6   61745         2967      22:17:00    22:37:00    1   20.0
7   61745         2967      23:55:00    23:58:00    1   3.0

得到这个:

  account_id    asset_id     tunein      tuneout resume watching(minute)
1   61745         2967      12:42:00    15:56:00    0   26.0
2   61745         2967      15:57:00    16:23:00    0   26.0
3   61745         2967      21:06:00    23:58:00    0   27.0

让我们根据 resume 列中 0 的位置用 cumsum 创建组:

df = (
    df.groupby(df['resume'].eq(0).cumsum())
        .agg({'account_id': 'first', 'asset_id': 'first',
              'tunein': 'first', 'tuneout': 'last', 'resume': 'first',
              'watching(minute)': 'sum'})
        .rename_axis(None)
)

字典也可以通过编程方式创建:

d = {c: 'first' for c in df.columns}  # default 'first'
d['tuneout'] = 'last'  # set specific columns
d['watching(minute)'] = 'sum'
df = df.groupby(df['resume'].eq(0).cumsum()).agg(d).rename_axis(None)

两个选项都产生 df:

   account_id  asset_id    tunein   tuneout  resume  watching(minute)
1       61745      2967  12:42:00  15:56:00       0              26.0
2       61745      2967  15:57:00  16:23:00       0              26.0
3       61745      2967  21:06:00  23:58:00       0              27.0

组的创建方式:

df['resume'].eq(0).cumsum()
0    1
1    1
2    1
3    2
4    3
5    3
6    3
Name: resume, dtype: int32