基于含列表的已有特征创建新特征:按指定元素数量赋值方法咨询
解决方案:无需if else,用集合操作或矢量化统计更简便
首先你原来的代码逻辑有问题:isin()是判断整个列表元素是否在给定的列表里,比如df['host_verifications'].isin(['email'])是检查某一行的host_verifications是否等于['email'],而不是判断这个列表里包含email,根本没法统计符合条件的元素数量。
不用写一堆条件枚举,也不需要if else,直接统计列表中属于目标集合的元素个数就行,两种高效实现方式:
方法1:集合交集统计(简洁直观)
定义目标集合后,用apply计算每行列表和目标集合的交集长度:
target_verifications = {'email', 'phone', 'work_email'} df['verification_count'] = df['host_verifications'].apply( lambda x: len(set(x) & target_verifications) )
- 原理:把每行的
host_verifications转成集合,和目标集合求交集,交集的长度就是符合条件的元素数量,正好对应你要的1/2/3。
方法2:逐元素判断求和(大数据量更高效)
如果数据集很大,apply可能稍慢,可以用逐元素判断后求和的方式:
target_verifications = {'email', 'phone', 'work_email'} df['verification_count'] = df['host_verifications'].apply( lambda x: sum(1 for item in x if item in target_verifications) )
- 原理:遍历每行列表里的元素,统计属于目标集合的个数,结果同样是1/2/3。
这两种方法都能自动覆盖所有可能的组合,不用手动枚举所有列表情况,比你原来的写法简洁太多,完全不需要if else语句。
内容的提问来源于stack exchange,提问作者VentiB
相关产品推荐
相关产品推荐

