首页 > 解决方案 > 创建一列,按条件将一组行的最大值分配给该组中的所有行

问题描述

我有一个看起来像这样的数据框:

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

请指教。谢谢你。

标签: pythonpandas

解决方案


方法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是按组排序的,您可以反转数据帧并执行 groupbycummax

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

推荐阅读