对整个DataFrame应用自定义函数时报KeyError: 'EQ'如何解决?
问题原因及解决方案
核心报错原因:调用apply()时未指定axis=1参数,pandas的apply默认axis=0按列遍历,此时传入lambda的x是整列的Series对象,无法通过列名EQ取对应行的值,因此抛出KeyError。
解决方法
- 方法1:指定按行遍历,修改
apply参数即可
df_g['F'] = df_g.apply(lambda x: get_substr(x['EQ'],'-',1), axis=1)
- 方法2:更高效的向量化实现(不需要自定义函数,性能远高于行遍历
apply)
如果你的需求是提取第一个-之前的子串,直接用pandas原生字符串方法即可:
df_g['F'] = df_g['EQ'].str.split('-').str[0]
如果需要提取第n个分隔符之间的内容,也可以直接使用str.split的n参数控制分割次数,避免自定义函数的性能损耗。
其他排查点
- 确认列名无隐藏字符:执行
print(df_g.columns.tolist()),检查EQ列名是否存在空格、换行符等肉眼不可见的特殊字符,如果存在可以先清洗列名:
df_g.columns = df_g.columns.str.strip()
- 修正自定义函数的缩进错误:你提供的
find_nth函数中return start行没有正确缩进,实际运行会抛出语法错误,修正后的函数如下:
def find_nth(string, char, n): start = string.find(char) while start >= 0 and n > 1: start = string.find(char, start+len(char)) n -= 1 return start def get_substr(string,char,n): if n == 1: return string[0:find_nth(string,char,n)] else: return string[find_nth(string,char,n-1)+len(char):find_nth(string,char,n)]
内容的提问来源于stack exchange,提问作者ImFabien75
相关产品推荐
相关产品推荐

