如何移除DataFrame中A列值存在于B列单元格的行
移除A列值出现在B列任意单元格中的行
原始数据
| A | B |
|---|---|
| dog_b | dog_k,cat_a |
| cat_a | cat |
| fish | |
| bird_c | |
| elephant | bird_c |
需求
删除所有A列的值存在于B列任意单元格的逗号分隔内容中的行。例如A列的cat_a出现在dog_b的B单元格里,bird_c出现在elephant的B单元格里,这两行需要移除,最终期望输出如下:
期望输出
| A | B |
|---|---|
| dog_b | dog_k,cat_a |
| fish | |
| elephant | bird_c |
无效代码及原因
尝试了以下代码但未生效,输出和原数据一致:
b = df['B'] df = df[~(df['A'].isin(b.values))]
问题在于这段代码是直接匹配A列值和B列的整个单元格值,而没有识别到B单元格内逗号分隔的子内容。比如cat_a并不等于任何一个B单元格的完整值,但它是某个B单元格的子项,原代码无法捕捉这种情况。
正确解决方案
先提取B列所有非空单元格中的逗号分隔值,组成一个完整集合,再用这个集合筛选A列:
方法一:分步实现
# 初始化集合存储所有B列的子值 all_b_subvalues = set() # 遍历B列非空值,拆分后加入集合 for cell_val in df['B'].dropna(): all_b_subvalues.update(cell_val.split(',')) # 筛选A列不在集合中的行 df = df[~df['A'].isin(all_b_subvalues)]
方法二:简洁一行式
# 拼接所有B列非空值,拆分后转成集合 all_b_subvalues = set(','.join(df['B'].dropna()).split(',')) # 过滤行 df = df[~df['A'].isin(all_b_subvalues)]
内容的提问来源于stack exchange,提问作者dr_tt
相关产品推荐
相关产品推荐

