Pandas Groupby 并根据用户输入将数据集划分为子组,并将每个子组的标签编号划分为子组



这是我的数据:

ID  Mnth Amt    Flg
B   1   10             0
B   2   12             0
B   3   14             0
B   4   41             0
B   5   134            0
B   6   14             0
B   7   134            0
B   8   134            0
B   9   12             0
B   10  41             0
B   11  4              0
B   12  14             0
B   12  14             0
A   1   34             0
A   2   22             0
A   3   56             0
A   4   129            0
A   5   40             0
A   6   20             0
A   7   58             0
A   8   123            0

如果我给出 3 作为输入,我的输出应该是:

ID  Mnth Amt Flg Level_Flag
B   1   10  0   0
B   2   12  0   1
B   3   14  0   1
B   4   41  0   1
B   5   134 0   2
B   6   14  0   2
B   7   134 0   2
B   8   134 0   3
B   9   12  0   3
B   10  41  0   3
B   11  4   0   4
B   12  14  0   4
B   12  14  0   4
A   1   34  0   0
A   2   22  0   0
A   3   56  0   1
A   4   129 0   1
A   5   40  0   1
A   6   20  0   2
A   7   58  0   2
A   8   123 0   2

所以基本上我想将数据划分为子组,每个子组中自下而上有 3 行,并按照level_flag列中所述标记这些子组。我有像A,C等ID。所以我想为每组 ID 执行此操作。

编辑 :- 我希望在按 ID 分组后完成同样的事情

首先,我们将 df 的长度除以n来确定nums的唯一数字。然后我们nrepeat这些数字。最后,我们反转数组并在length of df处将其切碎,然后再反转一次。

def create_flags(d, n):
nums = np.ceil(len(d) / n)
level_flag = np.repeat(np.arange(nums), n)[::-1][:len(d)][::-1]

return level_flag
df['Level_Flag'] = df.groupby('ID')['ID'].transform(lambda x: create_flags(x, 3))
ID  Mnth  Amt  Flg  Level_Flag
0   B     1   10    0         0.0
1   B     2   12    0         1.0
2   B     3   14    0         1.0
3   B     4   41    0         1.0
4   B     5  134    0         2.0
5   B     6   14    0         2.0
6   B     7  134    0         2.0
7   B     8  134    0         3.0
8   B     9   12    0         3.0
9   B    10   41    0         3.0
10  B    11    4    0         4.0
11  B    12   14    0         4.0
12  B    12   14    0         4.0

要删除不完整的行,请使用GroupBy.transform

m = df.groupby(['ID', 'Level_Flag'])['Level_Flag'].transform('count').ge(3)
df = df[m]
ID  Mnth  Amt  Flg  Level_Flag
1   B     2   12    0         1.0
2   B     3   14    0         1.0
3   B     4   41    0         1.0
4   B     5  134    0         2.0
5   B     6   14    0         2.0
6   B     7  134    0         2.0
7   B     8  134    0         3.0
8   B     9   12    0         3.0
9   B    10   41    0         3.0
10  B    11    4    0         4.0
11  B    12   14    0         4.0
12  B    12   14    0         4.0

最新更新