使用groupby+apply+lambda调用自定义normalize函数失败求助
问题分析与解决方案
错误原因
- 索引对齐问题:
groupby.apply()返回的结果会保留分组的层级索引,直接赋值给原数据集的新列时,原数据集的索引与返回结果的索引无法匹配,从而触发索引查找相关错误(即你遇到的_engine.get_loc报错)。 - 元素取值错误:代码中
week[0]是按索引值取元素,而非分组后的第一个元素。如果原数据集的索引不是连续的0起始整数,会取到错误值甚至抛出KeyError。
修正方案
方案一:使用transform替代apply(推荐)
transform会自动返回与原数据集长度一致、索引对齐的结果,无需额外处理。同时修改函数用iloc[0]确保取到分组的第一个元素:
def normalize(week): # iloc[0] 取分组后的第一个元素,不受原索引影响 norm_week = (week / week.iloc[0]) - 1 return norm_week # 用transform替代apply,自动对齐索引 dataset['col_1_norm'] = dataset.groupby('week_number')['col_1'].transform(normalize)
方案二:简化为一行代码(无需自定义函数)
直接在transform中写入逻辑,更简洁:
dataset['col_1_norm'] = dataset.groupby('week_number')['col_1'].transform( lambda x: (x / x.iloc[0]) - 1 )
验证示例
以你提供的数据集为例,执行后会生成如下结果:
| week_number | col_1 | col_1_norm |
|---|---|---|
| week_1 | 300 | 0.0 |
| week_1 | 500 | 0.666... |
| week_2 | 350 | 0.0 |
| week_2 | 420 | 0.2 |
内容的提问来源于stack exchange,提问作者carlo05
相关产品推荐
相关产品推荐

