Pandas匹配DataFrame字符串列与列表标记获奖演员的逻辑问题
问题根源
你的代码存在两个直接导致结果错误的核心问题:
- 字符串拆分未处理多余空格:直接用
split(',')拆分演员字符串时,逗号后的演员名会携带前置空格,比如'Alexander, Ann'拆分后得到['Alexander', ' Ann'],带空格的' Ann'和获奖名单里的'Ann'无法匹配。 - 循环判断逻辑失效:最后一层遍历演员列表的循环里,判断条件
x in item not in award中的x是上一段循环结束后残留的变量值(即获奖名单里的'Betty'),并非当前行拆分出的单个演员名,链式判断的逻辑也完全不符合“当前行存在任意一名获奖演员即标记1”的需求。
修复方案
方案1:修正原有循环逻辑
先把获奖名单转为集合(查询效率更高),拆分演员名时同步去除每个名字的前后空格,逐行判断两个集合是否存在交集即可:
import pandas as pd # 构造样例数据 df1 = pd.DataFrame() df1['cast'] = ['Alexander, Ann', 'Bob, Bill, Benedict, Betty'] df2 = pd.DataFrame() df2['awards'] = ['Betty'] # 获奖名单转集合,加速匹配 award_set = set(df2['awards'].tolist()) actors_with_awards = [] for cast_str in df1['cast']: # 拆分字符串后逐个去除演员名前后空格 cast_list = [name.strip() for name in cast_str.split(',')] # 存在交集则标记1,否则标记0 has_award = 1 if set(cast_list) & award_set else 0 actors_with_awards.append(has_award) df1['actors_with_awards'] = actors_with_awards
运行后输出结果完全符合预期:
| cast | actors_with_awards |
|---|---|
| Alexander, Ann | 0 |
| Bob, Bill, Benedict, Betty | 1 |
方案2:pandas向量化写法(无显式循环,数据量更大时运行速度更快)
不需要手写for循环,直接用pandas内置的apply方法处理即可,代码更简洁:
award_set = set(df2['awards']) df1['actors_with_awards'] = df1['cast'].apply( lambda x: 1 if set(i.strip() for i in x.split(',')) & award_set else 0 )
提示:如果原始数据里演员名存在更多格式问题(比如首尾多余空格、特殊符号),可以在匹配前先做统一的字符串清洗,避免匹配失败。
内容的提问来源于stack exchange,提问作者Rbc.F
相关产品推荐
相关产品推荐

