Pandas处理DataFrame拆分字符串时出现KeyError:18的解决求助
解决提取姓氏时的KeyError:18问题
错误根源
你循环遍历的是train的索引,但却在test_df_bin中读取数据——两个DataFrame的索引大概率不匹配,当train存在索引18但test_df_bin没有该索引时,就会触发KeyError。
另外代码还有潜在风险:比如名字拆分后可能只有单个元素,执行del name_id[0]后列表为空,后续取name_id[0]会引发索引越界错误;部分姓氏包含空格(如"van der Sar"),直接取拆分后的第一个元素会丢失完整姓氏。
修复方案
方案1:修正循环逻辑(基础版)
遍历test_df_bin自己的索引,同时增加长度判断避免报错:
last_name = [] # 遍历目标DataFrame的索引,而非train的索引 for i in test_df_bin.index: name_parts = test_df_bin['Name'][i].split(' ') # 先判断拆分后的列表长度,防止索引越界 if len(name_parts) > 1: # 取拆分后的第二个元素作为姓氏 surname = name_parts[1] else: # 若名字无空格,直接用原名字作为姓氏 surname = name_parts[0] last_name.append(surname) test_df_bin['Surname'] = last_name
方案2:Pandas矢量化操作(推荐,更高效)
用Pandas内置的字符串方法替代循环,处理更高效且代码更简洁:
# 只拆分一次空格,将名字分为"名"和"姓氏(含空格)"两部分 test_df_bin['Surname'] = test_df_bin['Name'].str.split(' ', n=1).str[1] # 对无空格的名字,用原名字填充姓氏列 test_df_bin['Surname'] = test_df_bin['Surname'].fillna(test_df_bin['Name'])
内容的提问来源于stack exchange,提问作者Efan Mutembo
相关产品推荐
相关产品推荐

