Python 创建一列,按条件将行集合的最大值分配给该组中的所有行

Python 创建一列,按条件将行集合的最大值分配给该组中的所有行,python,pandas,Python,Pandas,我有一个如下所示的数据帧: data metadata A 0 A 1 A 2 A 3 A 4 B 0 B 1 B 2 A 0 A 1 B 0 A 0 A 1 B 0 data metadata consecutive_count A 0

我有一个如下所示的数据帧:

data    metadata
A         0
A         1
A         2
A         3
A         4
B         0
B         1
B         2
A         0
A         1
B         0
A         0
A         1
B         0
data    metadata    consecutive_count
A         0              4
A         1              4
A         2              4
A         3              4
A         4              4
B         0              2
B         1              2
B         2              2
A         0              1
A         1              1
B         0              0
A         0              1
A         1              1
B         0              0
df.data
包含两个不同的类别,
A
B
df.metadata
存储一个运行计数,即类别更改之前连续出现的次数。我想创建一个列
continuous\u count
,将每个连续组的元数据的最大值分配给该组中的每一行。应该是这样的:

data    metadata
A         0
A         1
A         2
A         3
A         4
B         0
B         1
B         2
A         0
A         1
B         0
A         0
A         1
B         0
data    metadata    consecutive_count
A         0              4
A         1              4
A         2              4
A         3              4
A         4              4
B         0              2
B         1              2
B         2              2
A         0              1
A         1              1
B         0              0
A         0              1
A         1              1
B         0              0

请告知。谢谢。

方法1
您可以尝试在每组
数据的groupby上转换
max

s = df.data.ne(df.data.shift()).cumsum()
df['consecutive_count'] = df.groupby(s).metadata.transform('max')

Out[96]:
   data  metadata  consecutive_count
0     A         0                  4
1     A         1                  4
2     A         2                  4
3     A         3                  4
4     A         4                  4
5     B         0                  2
6     B         1                  2
7     B         2                  2
8     A         0                  1
9     A         1                  1
10    B         0                  0
11    A         0                  1
12    A         1                  1
13    B         0                  0

方法2
因为
元数据
是按组排序的,所以您可以反转数据帧并按
cummax

s = df.data.ne(df.data.shift()).cumsum()
df['consecutive_count'] = df[::-1].groupby(s).metadata.cummax()

Out[101]:
   data  metadata  consecutive_count
0     A         0                  4
1     A         1                  4
2     A         2                  4
3     A         3                  4
4     A         4                  4
5     B         0                  2
6     B         1                  2
7     B         2                  2
8     A         0                  1
9     A         1                  1
10    B         0                  0
11    A         0                  1
12    A         1                  1
13    B         0                  0

cummax
方法非常好