如何按每3行一组为Python DataFrame添加同值列?
问题:给DataFrame按每3行一组添加分组标识列
现有一个包含n行的DataFrame(n可被3整除),原始数据示例如下:
1 2 3 4 5 6 4 2 3 3 1 9 6 7 0 9 2 5需求是按每3行一组添加一列,每组内该列值相同,处理后效果如下:
1 2 3 A 4 5 6 A 4 2 3 A 3 1 9 B 6 7 0 B 9 2 5 B请问最优实现方法是什么?
最优实现方法
这是个很常见的分组标识需求,我推荐几种高效的实现方式,其中基于索引计算的方法是最优选择——它简洁、内存占用低,尤其适合大样本量的DataFrame:
方法1:索引整除+字母转换(最推荐)
利用DataFrame的索引直接计算分组编号,再把编号转换成对应的字母标识,代码非常简洁:
import pandas as pd # 构造示例DataFrame data = [[1,2,3],[4,5,6],[4,2,3],[3,1,9],[6,7,0],[9,2,5]] df = pd.DataFrame(data, columns=['col1','col2','col3']) # 核心代码:按每3行分组,生成A/B/C...的标识列 df['group'] = (df.index // 3).apply(lambda x: chr(ord('A') + x))
原理说明:
df.index // 3会给每一行生成组编号:前3行是0,接下来3行是1,以此类推chr(ord('A') + x)把编号0转成A,1转成B,轻松实现字母序列的分组标识- 这种方法不需要生成额外的重复数组,计算过程轻量化,时间复杂度为O(n),大数据量下优势明显
方法2:自定义标签+重复序列(适合固定标签场景)
如果你的分组标签不是A/B这种字母序列,而是自定义字符串,可以先生成标签列表,再重复对应次数:
import pandas as pd df = pd.DataFrame(data, columns=['col1','col2','col3']) n_groups = len(df) // 3 # 自定义分组标签 custom_labels = ['Group_X', 'Group_Y'] # 重复每个标签3次,添加为新列 df['group'] = pd.Series(custom_labels).repeat(3).values
适用场景:
当分组标签是固定的、非连续序列时,这种方法更直观,但需要提前知道分组数量,内存占用略高于方法1(因为要生成重复序列)
方法3:数字分组标识(最简版)
如果不需要字母/自定义标签,只需要数字分组号,直接一行代码搞定:
df['group'] = df.index // 3
处理后列值会是0,0,0,1,1,1...,适合只需要区分分组的场景,效率最高
内容的提问来源于stack exchange,提问作者Cranjis
相关产品推荐
相关产品推荐

