Python实现表格按行顺序均等拆分4组并新增Groups分组列的方法
原代码的核心问题
- 直接调用DataFrame自带的原索引做整数除法计算分组边界,混淆了“行的位置顺序”和“索引的数值大小”两个概念。只要原索引不是从0开始的连续整数序列(比如经过数据过滤、重排序、自定义索引的场景),计算出的分组位置就会完全错位,甚至出现组号超出预设范围的空值问题。
- 没有针对总长度无法被分组数整除的场景做兼容,仅靠
round(len(x)/n2)计算块大小,很容易出现分组数和预设值不一致的情况。
正确实现方案
可整除场景(即当前12行分4组的案例)
完全脱离原索引的影响,生成和行顺序一一对应的连续位置序列做分组计算:
import numpy as np n2 = 4 total_rows = len(x) chunk_size = total_rows // n2 # 生成0基的连续行位置,和原索引取值无关 x['Groups'] = (np.arange(total_rows) // chunk_size) + 1
运行后输出的分组结果和预期完全匹配:每3行划为1个组,组号从1到4,顺序和原表格行完全一致。
通用兼容场景(适配任意行数、任意分组数)
如果表格总长度无法被分组数整除,直接用np.array_split自动均衡拆分,保证刚好输出指定数量的组,不出现多余分组或空值:
import numpy as np n2 = 4 total_rows = len(x) # 生成连续的行位置序列 row_pos = np.arange(total_rows) groups = np.empty(total_rows, dtype=int) # 按拆分后的块顺序赋值对应组号,组号从1开始计数 for group_no, pos_chunk in enumerate(np.array_split(row_pos, n2), start=1): groups[pos_chunk] = group_no x['Groups'] = groups
这种写法不受原DataFrame索引类型、取值的影响,严格按照当前表格的行排列顺序拆分,不会出现分组错位的问题。
注:原有代码如果在默认0基连续索引的小样本下碰巧能跑对,本质是凑巧匹配了索引值和位置值,一旦遇到非连续索引的真实业务数据就会立刻失效。
内容的提问来源于stack exchange,提问作者MuSu18
相关产品推荐
相关产品推荐

