Pandas浮点型列转字符串并检测子串存在性报错解决
解决浮点型CNPJ列匹配特定子串并设置对应Porte值的问题
你遇到的TypeError: cannot convert the series to <class 'int'>错误,本质是因为浮点型的CNPJ值在转换为int时遇到了精度或范围问题——比如过长的CNPJ数值作为浮点数存储时,已经丢失了部分精度,或者超出了常规int类型的取值范围,导致无法正常转换。
下面给你两种可行的解决方法:
方法一:直接处理字符串(推荐)
跳过转int的步骤,把浮点型直接转为字符串后,去掉可能出现的.0后缀,再检查是否包含目标子串:
# 将CNPJ转为字符串,移除浮点转字符串后带的.0结尾 cnpj_clean = df['cnpj'].astype(str).str.replace(r'\.0$', '', regex=True) # 筛选匹配'0001'的行,设置Porte为'A' df.loc[cnpj_clean.str.contains('0001'), 'Porte'] = 'A'
这种方法避免了整数转换的风险,而且处理逻辑更直接,尤其适合已经存在精度丢失的浮点型CNPJ数据。
方法二:使用Nullable整数类型转换
如果你确定所有CNPJ都是合法的整数(没有小数部分),可以用pandas的Int64类型(注意大写I)来转换,它支持更大的数值范围,能避免普通int的溢出问题:
# 先转成支持大数值的Nullable整数,再转字符串匹配 df.loc[df['cnpj'].astype('Int64').astype(str).str.contains('0001'), 'Porte'] = 'A'
额外提醒
- 尽量不要用浮点型存储CNPJ这类标识性数字,后续导入数据时直接指定为字符串类型,能从根源避免精度丢失和转换问题。
- 赋值时优先使用
df.loc[筛选条件, 列名] = 值的格式,这是pandas官方推荐的写法,能避免潜在的SettingWithCopyWarning警告。
执行上述任意一种方法后,你就能得到预期的结果:
cnpj Porte
0 453232000125 A
1 11543123000156 A
2 345676
3 121234561023456
内容的提问来源于stack exchange,提问作者aabujamra
相关产品推荐
相关产品推荐

