Pandas十六进制转十进制时空值触发ValueError的优雅处理方案
Pandas 十六进制字符串列转十进制空值处理方案
问题复盘
转换十六进制字符串列时触发ValueError: invalid literal for int() with base 16: ''报错,根因是列中存在空字符串值。
- 无空值时直接用
.apply(int, base=16)可正常转换,示例运行结果正确 - 列中加入空字符串后直接转换触发报错
- 尝试用
lambda x: int(x, 16) if str(x).isdigit() else None规避报错时,所有值均返回None,结果不符合预期 - 现有临时方案为提前将空字符串替换为
'0'再转换,可得到正确结果但希望找到更优雅的实现
错误原因
之前的判断逻辑失效是因为str.isdigit()仅对纯0-9组成的数字字符串返回True,而十六进制字符串包含a-f的字母字符,所有合法的非纯数字十六进制值都会被误判为无效值,最终全部返回None。
推荐实现
方案1:修正判断逻辑,轻量改原apply写法
不需要额外依赖其他方法,直接修正lambda里的判断条件,仅过滤空字符串即可,逻辑直白易读:
# 空字符串对应返回空值(None) res = df['Col1'].apply(lambda x: int(x, 16) if x else None) # 如果希望空字符串和之前临时方案一样转为0,直接修改返回值即可 res = df['Col1'].apply(lambda x: int(x, 16) if x else 0)
方案2:使用Pandas原生向量化方法,性能更优
当数据集量级较大时,apply是逐行循环执行,效率偏低。可以用Pandas内置的pd.to_numeric方法实现向量化转换,执行速度更快,是Pandas场景下更推荐的写法:
# 空字符串对应返回空值 res = pd.to_numeric(df['Col1'].replace('', pd.NA), base=16) # 空字符串对应转为0 res = pd.to_numeric(df['Col1'].replace('', '0'), base=16)
注:
pd.to_numeric的base参数要求Pandas版本≥1.0.0,使用前请确认版本符合要求。
两种方案都不需要提前修改原DataFrame的列值,逻辑内聚,代码简洁,符合Pythonic的编码风格。
内容的提问来源于stack exchange,提问作者tommy.toolman
相关产品推荐
相关产品推荐

