明明存在列名App,为何Pandas按行apply时出现KeyError?
DataFrame apply按行操作触发KeyError的原因与解决办法
问题场景
创建包含App、Query、Label列的DataFrame:
train_data = pd.DataFrame({ 'Query':['shoerack','shoerack','shoerack','shoerack', 'nike shoes'], 'App': ['amazon', 'amazon', 'amazon', 'amazon', 'zalando'], 'Label':[1, 1, 1, 1, 1]})
执行以下apply操作时触发KeyError: 'App':
train_data.apply(lambda row: print(row['App']))
报错信息:
KeyError Traceback (most recent call last) Cell In[20], line 4 1 train_data = pd.DataFrame({'Query': ['shoerack','shoerack','shoerack','shoerack', 'nike shoes'], 2 'App': ['amazon', 'amazon', 'amazon', 'amazon', 'zalando'], 3 'Label': [1, 1, 1, 1, 1]}) ----> 4 train_data.apply(lambda row: print(row['App'])) KeyError: 'App'
明明App列存在,按行执行apply却报错,原因是什么?
原因分析
pandas.DataFrame.apply默认参数axis=0,即按列处理数据。此时lambda中的row实际代表的是DataFrame的每一列(一个Series对象),Series的索引是原DataFrame的行索引,自然找不到'App'这个索引值,因此触发KeyError。
解决办法
指定axis=1按行处理
修改apply调用,添加axis=1参数,让函数作用于每一行:train_data.apply(lambda row: print(row['App']), axis=1)此时
row代表每一行的Series,索引是列名,能正常获取'App'对应的值。更高效的替代方案
如果只是要打印App列的所有值,完全不需要用apply,直接访问列并操作更高效:# 直接打印整列内容 print(train_data['App'].tolist()) # 或逐行打印 for app in train_data['App']: print(app)apply按行操作的效率远低于直接列操作,非必要场景不建议使用。
内容的提问来源于stack exchange,提问作者s.blnc
相关产品推荐
相关产品推荐

