pandas - 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 分组后做同样的事情
解决方案
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
推荐阅读
- highcharts - 图例项目图案旋转或镜像问题
- linux - 具有多个 OR 的 Linux 查找命令
- sql-server - SQL convert NVARCHAR from one date format to another
- mysql - SQL - values from one table column to another table column
- reactjs - useState 的时间是什么时候保存的?
- vba - 从 Chrome 切换到 Microsoft Edge 浏览器
- javascript - 如何在javascript中创建动态圆角?
- java - Spring WebFlux:如果抛出此异常,如何在网页上显示来自自定义异常类的消息?
- reactjs - React 页脚中的字体真棒图标
- sql - 如何创建这个简单的视图?