关于Pandas中map内Lambda函数的条件逻辑疑问(含x != x部分)
拆解Pandas map中Lambda函数的嵌套if-else逻辑
我来帮你一步步拆解这段代码,把每个部分的逻辑都讲得明明白白~
首先先把完整的lambda函数摆出来,方便对照:
lambda x: x if x != x else (str(x)[:str(x).rfind('.0')] if str(x).rfind('.0') != -1 else str(x))
核心困惑点:x != x是什么意思?
这是Python里判断**NaN(非数字)**的一个小技巧!因为在Python中,只有NaN满足「自己不等于自己」——比如import numpy as np; np.nan != np.nan会返回True,而其他所有正常的值(数字、字符串等)都是x == x的。所以这部分的逻辑是:如果当前元素是NaN,就直接返回NaN本身。
拆解嵌套的if-else逻辑
接下来看else后面的部分,这是处理非NaN元素的逻辑,我们把它拆成更直观的写法:
# 非NaN时的逻辑 if str(x).rfind('.0') != -1: # 如果字符串结尾是".0",就截取到".0"之前的部分 return str(x)[:str(x).rfind('.0')] else: # 如果没有".0"结尾,就直接返回转成字符串的x return str(x)
这里的str(x).rfind('.0')是找字符串中.0最后出现的位置:
- 如果找到(返回值不等于-1),说明x转成字符串后是以
.0结尾的(比如数字123.0转成字符串是"123.0"),这时候截取到.0之前的部分,就得到了去掉小数位的字符串"123"; - 如果没找到(返回值是-1),说明x转成字符串后没有
.0结尾(比如456转成"456",789.5转成"789.5"),就直接返回原字符串。
整个函数的完整逻辑总结
把两部分合起来,这个lambda函数对check['Id']的每个元素做了这些事:
- 如果元素是NaN,保持NaN不变;
- 如果元素是正常值,转成字符串后,去掉可能存在的
.0结尾(也就是把带.0的数字转成整数形式的字符串,其他值保持原样)。
举几个实际例子更清楚:
- 输入
np.nan→ 返回np.nan - 输入
123.0→ 返回"123" - 输入
456→ 返回"456" - 输入
789.5→ 返回"789.5"
小补充:更清晰的写法
原代码用x != x判断NaN虽然巧妙,但可读性稍差,实际开发中可以用更直观的pd.isna(x)或者np.isnan(x)来替代,逻辑完全一样,但别人读起来更容易理解~
内容的提问来源于stack exchange,提问作者Sharvari Gc
相关产品推荐
相关产品推荐

