DataFrame列相除规避ZeroDivisionError时遭遇KeyError问题求助
问题解决:计算空中对抗胜率的KeyError与ZeroDivisionError处理
错误原因
你使用apply时未指定axis=1参数,默认会按列遍历(axis=0),此时lambda函数里的x是列级别的Series,其索引为行号,自然无法通过列名"Aerial duels"取值,因此抛出KeyError。
修复方案
方案1:修正apply的axis参数
将apply的axis设置为1,让它按行遍历,此时x代表每一行的Series,就能正确访问目标列名:
numerator_name = "Aerial duels won" denominator_name = "Aerial duels" ser_stat_values = df_competitions[[numerator_name, denominator_name]].apply( lambda x: x[numerator_name] / x[denominator_name] if x[denominator_name] != 0 else 0, axis=1 ) print(ser_stat_values)
方案2:用Pandas原生方法更高效
避免使用apply(性能弱于原生矢量化操作),直接用div方法结合replace处理除零情况:
numerator = df_competitions["Aerial duels won"] denominator = df_competitions["Aerial duels"] ser_stat_values = numerator.div(denominator).replace([float('inf'), float('-inf')], 0).fillna(0)
div自动执行元素级除法,除零会生成infreplace将无穷值替换为0fillna处理分母为NaN的情况(若存在)
额外说明
你直接相除时出现ZeroDivisionError,可能是因为Pandas配置中开启了mode.use_inf_as_na或相关严格模式,导致除零直接报错而非生成inf。可通过以下命令查看或修改配置:
import pandas as pd print(pd.get_option('mode.use_inf_as_na')) # 查看当前配置 pd.set_option('mode.use_inf_as_na', False) # 关闭后除零会生成inf
内容的提问来源于stack exchange,提问作者MKJ
相关产品推荐
相关产品推荐

