如何简化Pandas中多次GroupBy+Apply生成多列的重复代码?
简化Pandas重复分组计算的写法
你可以通过循环遍历偏移参数或者**字典推导结合assign()**来大幅减少重复代码,同时保持逻辑清晰,还能避免原代码中.values可能带来的索引对齐风险:
方法1:循环处理(直观易读)
把偏移量和对应的列名整理成列表,循环执行分组计算:
# 定义偏移量与目标列名的对应关系 offset_col_pairs = [(1, "1d"), (5, "5d"), (30, "30d")] for offset, col_name in offset_col_pairs: df[col_name] = df.groupby(cols)["ln"].transform(lambda x: x - x.shift(offset))
这里用transform替代apply,无需额外取.values,Pandas会自动帮你对齐索引,比原写法更安全。
方法2:字典推导+assign()(一行搞定)
利用字典推导生成所有新列的计算逻辑,再通过assign()一次性添加到DataFrame:
df = df.assign(**{ f"{n}d": df.groupby(cols)["ln"].transform(lambda x: x - x.shift(n)) for n in [1, 5, 30] })
这种写法更紧凑,适合需要快速生成多列的场景,同时保持代码的可读性。
补充说明
原代码中的.apply()+.values其实可以替换为.transform(),因为transform会返回与原DataFrame同长度、同索引的结果,直接赋值即可,不用手动处理索引对齐问题,代码更健壮。
内容的提问来源于stack exchange,提问作者Whitebeard13
相关产品推荐
相关产品推荐

