Pandas空DataFrame调用apply报错:是已知特性还是代码缺陷?
Pandas空DataFrame调用.apply赋值报错的原因分析
正常场景示例
import pandas as pd df = pd.DataFrame(dict(A=[1,2], B=[11,22])) print(df) # A B # 0 1 11 # 1 2 22 df["C"] = df.apply(lambda row: row["A"]+1, axis=1) print(df) # A B C # 0 1 11 2 # 1 2 22 3
空DataFrame场景报错示例
df = pd.DataFrame(columns=["A","B"]) print(df) # Empty DataFrame # Columns: [A, B] # Index: [] df["C"] = df.apply(lambda row: row["A"]+1, axis=1)
报错信息:
KeyError Traceback (most recent call last) ~\anaconda3\lib\site-packages\pandas\core\frame.py in _set_item_mgr(self, key, value) 3750 try: -> 3751 loc = self._info_axis.get_loc(key) 3752 except KeyError: ~\anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance) 3362 except KeyError as err: -> 3363 raise KeyError(key) from err 3364 KeyError: 'C' During handling of the above exception, another exception occurred: ValueError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_21916/2953292978.py in <module> ----> 1 df["C"] = df.apply(lambda row: row["A"]+1, axis=1) ~\anaconda3\lib\site-packages\pandas\core\frame.py in __setitem__(self, key, value) 3600 self._setitem_array(key, value) 3601 elif isinstance(value, DataFrame): -> 3602 self._set_item_frame_value(key, value) 3603 elif ( 3604 is_list_like(value)
结论与原因
这是Pandas的已知特性,并非核心代码缺陷。
当DataFrame为空时,apply(axis=1)的lambda函数不会被执行,返回的是一个空Series。由于没有行数据作为参考,Pandas无法推断这个空Series的 dtype 与结构,导致在新增列赋值时触发内部的类型匹配错误,最终抛出KeyError和ValueError。这种情况属于apply函数在无数据边界场景下的预期行为。
解决方案
推荐使用向量化操作替代逐行apply,这种方式在空DataFrame上能正常运行:
df["C"] = df["A"].add(1)
或者提前判断DataFrame是否为空,再执行对应逻辑:
if not df.empty: df["C"] = df.apply(lambda row: row["A"]+1, axis=1) else: df["C"] = pd.Series(dtype=int) # 手动指定数据类型
内容的提问来源于stack exchange,提问作者Eugene Offroad
相关产品推荐
相关产品推荐

