Pandas设置dtype=str读取CSV后,列dtype为object但元素为float报错的原因
报错触发的根本原因
这个报错和你写的筛选逻辑没有直接关系,本质是pd.read_csv的缺失值处理逻辑优先级高于手动指定的dtype转换规则,最终导致你看到的列类型和实际存储的元素类型不一致:
- 你配置的
dtype=str,仅会对CSV文件中存在实际可解析文本内容的单元格生效,将对应内容强制转换为字符串存入DataFrame。 - 对于CSV里的空值类位置(比如两个逗号直接相邻的空字段、仅含空白字符的单元格、被内置规则识别为缺失标记的内容),pandas会优先走缺失值识别流程,这些位置会被直接标记为默认缺失值
np.nan,不会进入你设置的字符串转换环节。 - 而
np.nan本身的原生类型就是float,它完全可以存在于object类型的列中。这也是你观察到列的dtype显示为object的原因:object类型列本身支持混合存储不同类型的Python对象,哪怕列里同时存了字符串和float类型的NaN,列的整体数据类型依然会被标记为object,不会变成纯浮点列,这也是你误以为整列所有元素都是字符串的核心认知偏差。
当你通过apply逐一遍历列元素时,只要遍历到存储了np.nan的单元格,拿到的临时变量x就是float类型的空值对象,自然不存在字符串专属的isnumeric()方法,最终抛出'float' object has no attribute 'isnumeric'的AttributeError。
你可以在触发报错前,临时打印这一列所有元素的类型分布,一定能找到少量float类型的非字符串值,这些值基本全是pandas自动识别生成的
np.nan缺失标记。
内容的提问来源于stack exchange,提问作者HrkBrkkl
相关产品推荐
相关产品推荐

