pandas空DataFrame按行apply输出两个空Series是特性还是bug?
问题原因
这个行为是pandas的设计特性,并非bug。
pandas的apply方法在正式处理数据前,会默认先调用1~2次传入的函数来推断返回结果的数据类型,哪怕DataFrame本身为空,这个类型推断步骤也会执行,你看到的两次空Series输出就是这个预推断步骤触发的,不是实际在遍历空的行数据。
解决方法
要让apply的表现和普通行遍历逻辑一致,可以用下面几种方案:
- 方案1:提前判断DataFrame是否为空,为空时直接返回预期的空结果,跳过
apply执行
示例代码:import pandas as pd df = pd.DataFrame([], columns=["a", "b", "c"]) if not df.empty: res = df.apply(lambda row: print(row), axis=1) else: # 自定义空场景的返回值,比如返回空Series res = pd.Series(dtype=object) - 方案2:给
apply指定result_type参数,跳过类型推断步骤
明确指定返回类型后,pandas不会再预执行函数做类型推断,空DataFrame场景下就不会触发函数执行:
示例代码:pd.DataFrame([], columns=["a", "b", "c"]).apply(lambda row: print(row), axis=1, result_type='reduce') - 方案3:换用原生行遍历方法
如果数据量不大,直接用iterrows或者itertuples遍历,空DataFrame下不会执行循环体,完全符合普通循环的逻辑:
示例代码:df = pd.DataFrame([], columns=["a", "b", "c"]) for idx, row in df.iterrows(): print(row)
内容的提问来源于stack exchange,提问作者Philippe Hebert
相关产品推荐
相关产品推荐

