地图熊猫里面的Lambda函数

时间:2018-05-12 05:45:41

标签: python pandas lambda

我无法理解下面定义的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值并返回一个字符串,其中没有输入中可能存在的小数。

2 个答案:

答案 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 值。