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)
验证结果
运行上述代码后,就能得到你预期的结果:
| A | B | C | D | |
|---|---|---|---|---|
| 0 | mom;dad;son; | sister;son; | yes;no;maybe; | 1 |
| 1 | dad; daughter;niece; | no;snow; | 0 | |
| 2 | son;dad; | cat;son;dad; | tree;dad;son; | 1 |
| 3 | daughter;mom; | niece; | referee; | 0 |
| 4 | dad;daughter; | cat; | dad; | 1 |
这样就完美解决你的问题啦!
内容的提问来源于stack exchange,提问作者FaCoffee
相关产品推荐
相关产品推荐

