Pandas布尔索引筛选:判断model/brand是否包含于name列的问题
问题分析与解决方案
核心问题:你的name、brand、model列被错误识别为数值类型(int64/float),且存在缺失值(报错中的float提示说明数据里有NaN),导致所有字符串相关操作失效。以下是分步解决方法:
1. 修复数据类型并处理缺失值
先把这三列强制转换为字符串类型,同时将缺失值(NaN)替换为空字符串,避免后续操作报错:
# 转换列类型为字符串,替换NaN为空字符串 autos[['name', 'brand', 'model']] = autos[['name', 'brand', 'model']].astype(str).replace('nan', '')
2. 实现每行的model包含判断
转换类型后,用apply逐行判断model是否在name中,这是符合你需求的正确方式:
model_in_name = autos.apply(lambda x: x['model'] in x['name'], axis=1)
执行后会得到你预期的布尔序列:
0 True 1 True 2 True 3 True 4 True 5 False dtype: bool
之前报错的原因解释
- 报错1:
autos["name"].str.contains(autos["model"])str.contains的参数需要是单个字符串或正则表达式,传入整个Series会触发哈希错误,因为Series是可变对象,无法被哈希。 - 报错2/3:
apply时的类型错误
你的列是数值类型(int64/float),数值不能用in操作判断“包含关系”,转换为字符串后即可正常使用in。 - 报错4:
"|".join(autos["model"])join要求所有元素都是字符串,但你的model列存在float类型的NaN,导致拼接失败。而且这个方法本身逻辑错误——它是判断name包含任意一个model,而非当前行的model,不符合你的需求。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

