首页 > 解决方案 > 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 分组后做同样的事情

标签: pandaspandas-groupby

解决方案


nums首先,我们通过将 df 的长度除以 来确定唯一数字n。然后我们repeat这些数字n倍。最后,我们将数组反转并在 at 处将其切掉,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

推荐阅读