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

时间:2019-10-29 23:21:56

标签: 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

df.data包含两个不同的类别,ABdf.metadata存储一个运行计数,该计数是类别在类别更改之前连续出现的次数。我想创建一列consecutive_count,该列将每个连续组的元数据最大值分配给该组中的每一行。它应该看起来像这样:

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 个答案:

答案 0 :(得分:2)

方法1
您可以尝试在max的每组的groupby上变换data

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
由于metadata是按组排序的,因此您可以反转数据框并按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