Pandas 1.4.4中DataFrame.apply处理空DF时返回类型异常问题
Pandas apply在空DataFrame下返回类型异常的原因分析
问题场景
我需要处理空DataFrame和非空DataFrame的衍生Series场景,比如构造空DataFrame:
import pandas as pd df = pd.DataFrame({'a':[], 'b':[]})
当同时满足以下两个条件时,apply(axis='columns')会意外返回DataFrame而非预期的Series:
- 输入的DataFrame为空
- 在apply的lambda表达式中调用了外部函数
示例代码如下:
def f(x): if x%2 == 0: return True else: return False test1 = df.apply(lambda row: 'foo' if f(row[0]) else 'bar', axis='columns') test2 = df.apply(lambda row: 'foo' if True else 'bar', axis='columns')
其中test1返回空DataFrame,test2返回空Series;而当DataFrame非空时,两者都会正常返回Series,符合预期。
异常原因
这是Pandas 1.4.4版本存在的bug。在处理空DataFrame的apply操作时,Pandas需要推断返回结果的类型:
- 对于test2这类lambda内部没有外部函数调用的情况,Pandas可以直接解析lambda的返回值类型(字符串标量),因此正确推断出应该返回Series。
- 对于test1这类lambda调用了外部函数的情况,Pandas的类型推断逻辑出现错误,无法正确识别返回值的标量属性,错误地将结果判定为需要返回DataFrame。
版本修复验证
升级至Pandas 1.5.2版本后,该bug已被修复,test1和test2均会返回空Series,与预期一致。
内容的提问来源于stack exchange,提问作者Marmoh
相关产品推荐
相关产品推荐

