如何判断DataFrame中的演员名是否存在于带数字后缀的另一DataFrame中?
解决方法
方法一:提取df2.id中的纯姓名后匹配
先把df2.id里的姓名部分提取出来,再用isin做匹配。考虑到分隔符可能是短横-或长横–,用正则分割更稳妥:
# 提取df2中id列的姓名部分,兼容两种分隔符 df2_clean = df2.id.str.extract(r'^(.*?)\s*[-–]\s*\d+$')[0] # 执行匹配 df.assign(indf=df.Actors.isin(df2_clean).astype(int))
正则r'^(.*?)\s*[-–]\s*\d+$'的作用是:从字符串开头匹配任意字符(非贪婪模式),直到遇到短横/长横,忽略横杠前后的空格,匹配后续年份数字,最终提取横杠前的姓名部分。
方法二:读取CSV时直接清洗列数据
如果不想后续再处理,可以在读取CSV时直接清洗id列:
def clean_actor_id(s): # 按两种分隔符分割,取第一部分作为姓名 if ' - ' in s: return s.split(' - ')[0] elif ' – ' in s: return s.split(' – ')[0] return s # 读取时指定转换器处理id列 df2 = pd.read_csv('your_file.csv', converters={'id': clean_actor_id}) # 之后直接用原代码匹配即可 df.assign(indf=df.Actors.isin(df2.id).astype(int))
方法三:反向模糊匹配(需注意重名风险)
如果担心提取姓名时的格式遗漏,也可以反向检查每个演员名是否存在于df2.id的字符串中,但要注意避免子串误匹配(比如"Ben"会匹配"Ben Kingsley - 19xx"):
df.assign(indf=df.Actors.apply(lambda x: any(x == s.split(' - ')[0] or x == s.split(' – ')[0] for s in df2.id)).astype(int))
内容的提问来源于stack exchange,提问作者nic.o
相关产品推荐
相关产品推荐

