You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:50:26