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

Python:判断DataFrame中三列文本是否存在共同单词

解决DataFrame多列共同单词检测的标记问题

嘿,我来帮你搞定这个问题!首先理清楚你的核心需求:检查A、B、C三列中是否存在任意两列共享的单词,存在则在新增列D标记1,不存在标记0。你之前用iterrows写的代码结果全为0,主要是几个小细节出了问题,咱们一步步拆解解决。

先看你代码里的问题

  • 赋值逻辑错误:你用了df['D'][index]==1,这是比较运算符(判断值是否等于1),不是赋值操作!得改成=才会把值写入D列。更推荐用df.loc[index, 'D']赋值,避免链式索引的警告和潜在的修改失效问题。
  • 空字符串干扰:你的单元格内容都以分号结尾(比如mom;dad;son;),用split(';')分割后会产生空字符串'',这个空值会被误判为“共同单词”;另外部分单词前后带空格(比如原数据里的 yes),也会导致匹配失败。
  • iterrows效率问题:虽然能实现功能,但iterrows处理大数据集时效率很低,更推荐用apply来简化逻辑、提升性能。

修复后的两种实现方式

方式1:修正你原来的iterrows代码

先初始化D列,再处理每一行的单词,过滤空值和空格后检查交集:

# 先初始化D列为0
df['D'] = 0

for index, row in df.iterrows():
    # 处理每一列:分割字符串、去除单词首尾空格、过滤空字符串
    words_a = [word.strip() for word in row['A'].split(';') if word.strip()]
    words_b = [word.strip() for word in row['B'].split(';') if word.strip()]
    words_c = [word.strip() for word in row['C'].split(';') if word.strip()]
    
    # 转换为集合,检查任意两列的交集是否非空
    set_a, set_b, set_c = set(words_a), set(words_b), set(words_c)
    if (set_a & set_b) or (set_a & set_c) or (set_b & set_c):
        df.loc[index, 'D'] = 1
    else:
        df.loc[index, 'D'] = 0

方式2:更高效简洁的apply方法

用apply遍历每一行,代码更紧凑,处理大数据集时性能更优:

def has_common_words(row):
    # 辅助函数:处理单列,返回去重的单词集合(过滤空值和空格)
    process_column = lambda col: set(word.strip() for word in col.split(';') if word.strip())
    
    # 处理三列得到对应的单词集合
    set_a = process_column(row['A'])
    set_b = process_column(row['B'])
    set_c = process_column(row['C'])
    
    # 检查任意两个集合是否有交集,返回对应标记
    return 1 if (set_a & set_b) or (set_a & set_c) or (set_b & set_c) else 0

# 应用函数到每一行,生成D列
df['D'] = df.apply(has_common_words, axis=1)

验证结果

运行上述代码后,就能得到你预期的结果:

ABCD
0mom;dad;son;sister;son;yes;no;maybe;1
1dad; daughter;niece;no;snow;0
2son;dad;cat;son;dad;tree;dad;son;1
3daughter;mom;niece;referee;0
4dad;daughter;cat;dad;1

这样就完美解决你的问题啦!

内容的提问来源于stack exchange,提问作者FaCoffee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:40:33