如何为Pandas列实现按需调用的懒执行计算函数
Pandas 懒执行计算列问题解答
1. 原生Pandas的assign方法传入lambda是否能实现需求中的懒执行效果?
不能。
原生Pandas的assign方法是立即执行的,哪怕你传入的参数是lambda函数,Pandas会在assign被调用的瞬间就触发lambda的计算逻辑,直接生成完整的IsDate列结果存储到DataFrame中,不会等到后续访问该列时才执行计算,完全达不到你要求的「仅调用时计算、不预计算全量附加列」的效果。
2. 两种写法是否等价、是否具备懒执行特性?
二者执行逻辑完全等价,均不具备懒执行特性。
两种写法的计算时机没有任何差异,都是代码运行到对应行时就完成全量列的计算,区别仅在于语法层面:
df = df.assign(IsDate = lambda x:(x.dt < date(2021,11,1)))是链式写法,返回新的DataFrame对象,不会修改原始dfdf['IsDate'] = x.dt < date(2021,11,1)是原地修改写法,直接在原df对象上新增列
适配需求的实现方案参考
你需要的按需生成计算列的场景,可以通过以下方式落地:
- 自行封装自定义DataFrame子类,重写
__getitem__方法,维护一个计算逻辑映射字典,访问指定列时如果列不存在,就调用对应逻辑计算并缓存结果后再返回 - 直接使用支持懒执行的DataFrame框架,比如Dask DataFrame,天然支持计算逻辑延迟到触发
compute操作时才执行,完全符合仅生成所需计算列的要求 - 简单场景可以自行维护函数字典,key为计算列名、value为对应的计算逻辑,用户需要哪列就调用对应函数生成结果后再加入DataFrame,不要提前把所有列预写入df中
内容的提问来源于stack exchange,提问作者Kapil
相关产品推荐
相关产品推荐

