繁体   English   中英

地图熊猫中的 Lambda 函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM