[英]Lambda function inside map pandas
我无法理解下面定义的 lambda 函数中的 if 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 值并返回一个没有输入中可能存在的小数的字符串。
我认为这是用于NaN
s,因为:
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
的字符串并删除转换为字符串:
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
正如 jezrael 发布的那样,它只是过滤掉NaN
值。 不过,这不是最 Pythonic 或可读的编写方式。
如果您在通过 lambda 函数运行NaN
遇到问题,您应该添加参数na_action='ignore'
以便您的 map 函数忽略NaN 并避免错误。
所以你应该尝试:
map(lambda x: your_function_here , na_action='ignore')
代替:
map(lambda x: x if x != x else ( your_function_here ) )
您应该期望在两个代码中得到相同的结果,但第一个更具有 Python 风格和可读性,因为它清楚地表明我们忽略了 Na 值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.