为何Pandas中assign生成新列时lambda可生效?
为什么pandas.DataFrame.assign()中引用同语句新列必须用lambda?
核心逻辑:计算时机的差异
- 直接写
df['D']这类表达式时,代码会在assign方法开始执行前就完成求值,此时原始DataFrame里还没生成新的D列,要么报错,要么根本用不到刚生成的列值。 - 而lambda表达式是延迟计算的:assign会按顺序处理每一列的赋值,当执行到lambda时,它接收的参数
x是前面所有assign操作完成后的中间DataFrame,这个中间df已经包含了刚生成的新列,所以能正确引用。
代码执行流程拆解
拿你的示例代码一步步分析:
df = (df .assign(A = df['A'] * df['B'], D = df['B'] * df['C'], D = lambda x: x['D'] * x['C']))
- 第一步
A = df['A'] * df['B']:这里的df是未经过任何assign修改的原始DataFrame,计算出A的新值后,生成临时中间df(记为df1),df1的A是新值,B、C保留原值。 - 第二步
D = df['B'] * df['C']:同样基于原始df的B、C计算,生成中间df2,df2新增了D列(值为原始B*C)。 - 第三步
D = lambda x: x['D'] * x['C']:此时的x就是前面得到的df2,所以x['D']是刚在df2里生成的D列,x['C']是df2里的C列,计算后覆盖D列,得到最终结果。
如果把第三步改成D = df['D'] * df['C'],会直接触发KeyError,因为原始df里根本不存在D列——这行代码在assign启动前就会被求值,自然找不到目标列。
一句话总结
直接引用原df的写法只能用到原始列,lambda则能拿到当前步骤前的所有中间结果,所以能访问同语句里刚生成的新列。
内容的提问来源于stack exchange,提问作者Time_Series_FTW
相关产品推荐
相关产品推荐

