如何判断df1的whitelist列是否包含df2的blocked列内容(Python)
问题解决方法
原代码问题分析
- 第一行代码逻辑错误:
x['blocked'] in df1['whitelist']是判断blocked值是否完全等于df1['whitelist']某一行的完整内容,而非判断该值是否是whitelist字符串中的子元素(比如逗号分隔的数字)。 - 第二行代码维度错误:列表推导式生成的是多个Series(每个对应一个
blocked值的查找结果),直接赋值给df1['yes/no']会导致维度不匹配,且str.find返回的是字符索引,无法直接作为"是否存在"的标记。
正确实现方案
假设你的数据场景是:
df1['whitelist']是逗号分隔的字符串(如"1,3,5")df2['blocked']是单个值(如1、4)- 需求1:给
df2新增列,标记blocked值是否存在于df1的任意whitelist中 - 需求2:给
df1新增列,标记该行whitelist是否包含df2中的任意blocked值
实现需求1的代码
# 提取df1所有whitelist中的元素,转为集合(去重且查找高效) white_elements = set() for item in df1['whitelist']: # 按逗号分割字符串,加入集合 white_elements.update(item.split(',')) # 给df2新增列,判断blocked是否在集合中 df2['white_list_num'] = df2['blocked'].apply(lambda x: 0 if str(x) in white_elements else 'no num')
实现需求2的代码
# 把df2的blocked值转为字符串集合 blocked_elements = set(df2['blocked'].astype(str)) # 给df1新增列,判断该行whitelist是否包含任意blocked值 df1['yes/no'] = df1['whitelist'].apply( lambda x: 'yes' if blocked_elements.intersection(x.split(',')) else 'no' )
内容的提问来源于stack exchange,提问作者Aizhan Askhatova
相关产品推荐
相关产品推荐

