Pandas按id列分组为每个组添加多条带编号行的实现方法
问题原因分析
你使用的df.groupby('id').assign(new_col=range(2020, 2022))无法生效的核心原因是:DataFrameGroupBy对象调用assign时,要求赋值的序列长度必须和每个分组的行数完全对齐。你的每个id分组只有1行数据,传入长度为2的年份序列,无法匹配行数,因此不会得到预期结果。
正确实现方案
方案1:笛卡尔合并(适用于id为唯一值的场景,效率更高)
如果你的df中id确实是唯一标识符,每行对应唯一id,直接构造目标值的序列后做笛卡尔合并即可,代码最简洁运行速度也最快:
import pandas as pd # 构造你需要的new_col取值序列,可任意修改长度和取值 new_col_vals = pd.DataFrame({'new_col': range(2020, 2022)}) # 笛卡尔合并后每个原行都会和所有new_col取值配对,生成对应行数 df = df.merge(new_col_vals, how='cross')
方案2:分组生成(适用于id重复或不同id要生成不同new_col的场景,更灵活)
如果需要按id分组做自定义逻辑的新值生成,可以用groupby.apply配合explode实现:
df = df.groupby('id', group_keys=False).apply( lambda group: group.assign(new_col=[range(2020, 2022)]).explode('new_col') )
如果不同id需要生成不同的new_col取值范围,只需要修改lambda内的列表生成逻辑即可。
效果验证
假设你的原df结构如下:
| id | other_col |
|---|---|
| 1 | 测试值1 |
| 2 | 测试值2 |
两种方案运行后都会得到预期结果:
| id | other_col | new_col |
|---|---|---|
| 1 | 测试值1 | 2020 |
| 1 | 测试值1 | 2021 |
| 2 | 测试值2 | 2020 |
| 2 | 测试值2 | 2021 |
内容的提问来源于stack exchange,提问作者Arturo Sbr
相关产品推荐
相关产品推荐

