为何pandas的apply对两个lambda返回不同类型且空DataFrame下赋值报错
问题解答
为什么两个lambda函数的apply返回类型不同
pandas对空DataFrame执行行方向(axis=1)的apply操作时,会先执行一次返回类型推断:构造一个空Series作为测试行传入自定义函数,根据执行结果判定返回类型:
l3 = lambda r: ""执行测试时直接返回空字符串,无任何报错,pandas判定该函数返回标量,最终apply返回Series类型,可直接赋值给单列。l4 = lambda r: f"{r.col1}"执行测试时,空测试行不存在col1属性会抛出属性错误。此时pandas的异常处理分支会判定该函数返回类数组结构,直接返回原空DataFrame的副本作为apply结果,类型为DataFrame。将多列DataFrame赋值给单列时,就会触发“Wrong number of items passed 3, placement implies 1”的报错。
该逻辑属于pandas内部未明确写入公开文档的类型推断处理,要求行处理函数必须兼容空Series的调用场景。
空DataFrame场景下的兼容写法
有三种常用的解决方案,推荐优先使用第三种向量化写法,性能最优且无兼容性问题:
- 方案1:修改lambda函数,兼容空测试行
提前判断属性是否存在,避免测试执行时报错:
l4 = lambda r: f"{r.col1}" if "col1" in r.index else "" df["col4"] = df.apply(l4, axis=1)
- 方案2:强制压缩返回结果为Series
对apply的返回结果调用squeeze(),把单列DataFrame转为Series:
df["col4"] = df.apply(l4, axis=1).squeeze()
- 方案3:替换apply为pandas原生向量化操作
你的需求是将col1转为字符串格式,完全不需要使用apply,直接用原生类型转换方法即可,空DataFrame场景下也能正常运行:
df["col4"] = df["col1"].astype(str)
内容的提问来源于stack exchange,提问作者bers
相关产品推荐
相关产品推荐

