为什么pandas的assign函数处理列表返回值报错而apply正常?
问题核心原因
两个方法的传参维度和处理逻辑完全不同:
- 调用
assign时,你传入的lambda接收的是完整的DataFrame对象,此时x.val是长度为5的Series,你在自定义函数中将返回结果套了一层列表,得到的是长度为1的列表(列表内仅包含1个长度为5的Series),和DataFrame的5行索引长度不匹配,因此抛出长度对齐错误。 - 调用
df.val.apply时,apply是逐元素遍历val列,每次给自定义函数传入的是单个数值,每个数值计算后返回1个长度为1的列表,最终返回的总长度和行数完全匹配,因此可以正常赋值。
正确使用方案
如果你需要在assign中实现相同的每个元素为列表的效果,或者避免报错,可以选择以下两种修改方式:
方案1:不需要返回列表结构时,直接返回计算后的Series
def squareMe(x): return x**2 df = df.assign(val2 = lambda x: squareMe(x.val))
方案2:需要每个元素为列表结构时,在assign内调用apply逐元素处理
def squareMe(x): return [x**2] df = df.assign(val2 = lambda x: x.val.apply(lambda y: squareMe(y)))
内容的提问来源于stack exchange,提问作者imantha
相关产品推荐
相关产品推荐

