Pandas多列应用带IF判断的lambda函数保留空值的方法
问题根因
你之前添加的x.empty判断逻辑完全无法匹配目标处理场景:x.empty是pandas中Series/DataFrame的属性,作用是判断整个数据对象是否没有任何元素,根本不会逐行检查单元格内的单个值是否为空白。因此当代码遍历到单元格存储的空字符串''时,仍然会执行除以100、字符串格式化的逻辑,空字符串无法转成数值参与运算,自然会持续触发ValueError: invalid literal for int() with base 10: ''报错。
正确实现方法
空值判断的逻辑要下沉到处理单个单元格值的内层函数里,碰到空字符串、None、NaN这类空值时直接原样返回,非空值再执行除以100、千分位格式化保留两位小数的操作即可。
可读性优先写法
单独抽离格式化处理的函数,逻辑更清晰,后续调整规则也方便:
import pandas as pd def format_num(value): # 覆盖空字符串、None、pandas自动识别的NaN三类空值场景 if pd.isna(value) or value == '': return value return '{:,.2f}'.format(value / 100) df[['col_8', 'col_9', 'col_10']] = df[['col_8', 'col_9', 'col_10']].apply( lambda col: col.apply(format_num) )
简洁lambda写法
如果不想单独定义函数,可以直接在内层lambda里写三元判断:
import pandas as pd df[['col_8', 'col_9', 'col_10']] = df[['col_8', 'col_9', 'col_10']].apply( lambda col: col.apply(lambda v: v if (pd.isna(v) or v == '') else '{:,.2f}'.format(v/100)) )
注意事项
- 如果你的数据集在读取时已经把空白单元格自动转成了pandas的NaN空值,判断条件里的
or v == ''可以省略,仅保留pd.isna(v)就能覆盖所有空值场景。 - 不要用逐行循环遍历的方式实现这个需求,基于列的apply方法性能远高于逐行迭代。
内容的提问来源于stack exchange,提问作者sudden_clarity_clarence
相关产品推荐
相关产品推荐

