Pandas十六进制DataFrame转整数浮点数及拆列报错解决方案
报错原因
int() can't convert non-string with explicit base错误触发原因:
str.split(expand=True)拆分后,若每行十六进制串长度不一致,会自动填充None作为缺失值,列内会混合字符串与空值,并非全是字符串类型- pandas的
object是通用混合类型dtype,即使是字符串拆分得到的列,只要存在非字符串值(空值、数值等)都会显示为object类型,不代表列内全是字符串。
直接对整列传入int(base=16)时,碰到空值/非字符串值就会触发类型错误。
实现方案
无需手写显式循环,使用pandas内置向量化操作即可完成,性能远高于逐行循环:
import pandas as pd # 第一步:清洗拆分后的数据,去除单元格前后空白,统一空值格式 x_df = x_df.apply(lambda col: col.str.strip()).replace('', pd.NA) # 第二步:按规则分组列 int_cols = header[:24] # 前24列转换为整数 float_cols = header[24:-1] # 第25列到倒数第二列(排除末尾Checksum列)转换为浮点数 checksum_col = ["Checksum"] # 校验和列默认按十六进制整数处理 # 第三步:逐单元格把十六进制字符串转为整数,自动跳过空值 x_df = x_df.applymap(lambda val: int(val, base=16) if pd.notna(val) else pd.NA) # 第四步:按列规则转换对应数据类型 x_df[int_cols + checksum_col] = x_df[int_cols + checksum_col].astype("Int64") # 用pandas可空整数类型,兼容空值 x_df[float_cols] = x_df[float_cols].astype("float64")
如果你的浮点数列是多字节拼接的(比如相邻2/4个单字节组合为长十六进制数后再转浮点),只需在第三步转换前增加字节拼接逻辑即可,示例:
# 示例:若T列需要拼接"22""23"两个单字节的十六进制值再转浮点 x_df["T"] = x_df.apply(lambda row: int(f"{row['22']}{row['23']}", base=16), axis=1).astype("float64")
- 转换完成后可通过
x_df.dtypes查看各列类型,通过x_df.head()验证转换结果是否符合预期。
内容的提问来源于stack exchange,提问作者Swawa
相关产品推荐
相关产品推荐

