我无法理解下面定义的lambda函数中的else else if else的结构。特别是 - 部分:
if x != x
在此代码中:
check['Id'].map(lambda x: x if x != x else (str(x)[:str(x).rfind('.0')] if str(x).rfind('.0') != -1 else str(x))
PS:我得到的是上面的代码是格式化ID值并返回一个字符串,其中没有输入中可能存在的小数。
答案 0 :(得分:1)
我认为这是为了与NaN
合作,因为:
np.nan != np.nan
所以,如果NaN
s返回NaN
s,则处理字符串。
样品:
check = pd.DataFrame({'Id':[np.nan, '0909.0', '023', '09.06']})
a = check['Id'].map(lambda x: x if x != x else (str(x)[:str(x).rfind('.0')] if str(x).rfind('.0') != -1 else str(x)))
print (a)
0 NaN
1 0909
2 023
3 09
Name: Id, dtype: object
如果省略它,它会起作用,因为转换为字符串,但第一个值不是np.nan
,而是字符串nan
:
a = check['Id'].map(lambda x: (str(x)[:str(x).rfind('.0')] if str(x).rfind('.0') != -1 else str(x)))
print (a)
0 nan
1 0909
2 023
3 09
Name: Id, dtype: object
如果所有值都是NaN
s的字符串并删除转换为字符串:
a = check['Id'].map(lambda x: ((x)[:(x).rfind('.0')] if (x).rfind('.0') != -1 else (x)))
print (a)
AttributeError:'float'对象没有属性'rfind'
a = check['Id'].map(lambda x: x if x != x else ((x)[:(x).rfind('.0')] if (x).rfind('.0') != -1 else (x)))
print (a)
0 NaN
1 0909
2 023
3 09
Name: Id, dtype: object
答案 1 :(得分:1)
正如 jezrael 发布的那样,它只是过滤掉 NaN
值。
不过,这不是最 Pythonic 或可读的编写方式。
如果您在通过 lambda 函数运行 NaN
时遇到问题,您应该添加参数 na_action='ignore'
,以便您的映射函数忽略 NaN 并避免错误。
所以你应该尝试:
map(lambda x: your_function_here , na_action='ignore')
代替:
map(lambda x: x if x != x else ( your_function_here ) )
您应该期望在两个代码中得到相同的结果,但第一个更具有 Python 风格和可读性,因为它清楚地表明我们忽略了 Na 值。