Python中DataFrame姓名匹配报错及非iterrows实现方案求助
错误原因及解决方案
错误原因
你写的df["First Name"].str.find(row['First Name']) == 0会生成一个布尔类型的Series——每一行对应DF中该行姓名是否匹配当前MDF行的姓名。而if语句需要单个布尔值,直接把整个Series丢进去判断,Python无法确定你要的是「只要有一个匹配就为真」还是「全部匹配才为真」,因此抛出歧义错误。
解决方案
优先用Pandas的矢量化操作,避免低效的iterrows遍历:
方案1:精确匹配(判断姓名是否完全存在于DF中)
直接给MDF新增一列标注结果,这是效率最高的方法:
mdf['Exists_in_DF'] = mdf['First Name'].isin(df['First Name']).map({True: 'Yes', False: 'No'})
isin(df['First Name']):返回布尔Series,标记MDF每个姓名是否在DF的姓名列表里map(...):把布尔值转成你需要的Yes/No文本
方案2:模糊匹配(对应你原代码的开头匹配逻辑)
如果需要判断DF中是否有姓名以MDF的姓名开头,用apply结合any()实现:
mdf['Exists_in_DF'] = mdf['First Name'].apply( lambda x: 'Yes' if (df['First Name'].str.find(x) == 0).any() else 'No' )
(df['First Name'].str.find(x) == 0):生成布尔Series,标记DF中哪些姓名以x开头.any():判断该Series中是否存在至少一个True,即是否有匹配项
为什么不推荐iterrows
iterrows是逐行遍历DataFrame,数据量越大效率越低。Pandas的矢量化操作基于底层优化实现,速度比循环快几个数量级,能大幅提升处理效率。
内容的提问来源于stack exchange,提问作者Abinand Rejimon
相关产品推荐
相关产品推荐

