如何遍历含字符串的DataFrame行并匹配列表元素生成新列?
解决方案
你的代码问题在于循环中每次赋值都会覆盖df['matched'],最后只会保留最后一个列表元素的匹配结果,所以无法得到正确的多匹配结果。以下是几种可行的解决方法:
方法1:使用apply自定义匹配逻辑
先把匹配列表转成小写集合方便快速查找,同时构建小写值到原列表元素的映射字典,再对name列逐个处理:
import numpy as np import pandas as pd # 示例数据 df = pd.DataFrame({'name': ['tom', 'jerry', 'steven', 'Zeo']}) match_list = ['tom', 'zeo'] # 构建小写映射集合和字典 match_set = set(item.lower() for item in match_list) match_map = {item.lower(): item for item in match_list} # 生成matched列 df['matched'] = df['name'].apply(lambda x: match_map.get(x.lower(), np.nan))
运行后输出结果:
name matched 0 tom tom 1 jerry NaN 2 steven NaN 3 Zeo zeo
方法2:使用str.lower结合replace与where
通过字符串转小写、映射替换,再筛选出匹配项:
df['matched'] = df['name'].str.lower().replace(match_map).where(df['name'].str.lower().isin(match_set), np.nan)
原代码问题分析
你写的循环中,每一次迭代都会重新给df['matched']整列赋值:第一次循环处理tom时,只有tom对应的位置是tom,其余为nan;第二次循环处理zeo时,会覆盖整列数据,最终只有Zeo对应的位置是zeo,其他行(包括tom)都会变成nan,所以无法得到正确结果。
内容的提问来源于stack exchange,提问作者Tom Shang
相关产品推荐
相关产品推荐

