在DataFrame.apply()中列出理解而不是lambda?

时间:2017-10-11 06:04:33

标签: python lambda list-comprehension

我已经看过它(artima.compython-course.eu),而且Guido想要从Python中移除lambda,这表明使用列表理解可以实现相同的结果。当有人学习Python并努力掌握lambdas和列表理解时,我(到目前为止)赞成后者。
上面详述的python-course页面继续演示lambda函数的使用,实际上我可以重写使用list comprehension提供的示例。 E.g。

C = [39.2, 36.5, 37.3, 38, 37.8]
F1 = list(map(lambda x: (x *1.8) + 32, TC))
F2 = [(x *1.8) + 32 for x in TC]

其中F1和F2各自返回

[102.56, 97.7, 99.14, 100.4, 100.03999999999999]

在这些情况下,我同意可以使用列表理解而不是lambda,我更好地理解它们!

现在在使用DataFrame.apply()函数时,我一直在试图使用列表推导来提出lambda的替代方法。拿

G = pd.DataFrame({'year':[1992, 1996, 1999], 'winner':['Pakistan',\
        'Sri Lanka','Australia']}, columns = ['year','winner'])

给出了

   year     winner
0  1992   Pakistan
1  1996  Sri Lanka
2  1999  Australia

如果我想操作系列数据,在这种情况下重新格式化年份,lambda函数可以工作:

G['year'] = G['year'].apply(lambda x: "'{:02d}".format(x % 100))

返回,

  year     winner
0  '92   Pakistan
1  '96  Sri Lanka
2  '99  Australia

我无法找到使用列表理解来实现此目的的方法。 出于学术上的好奇心,有办法吗?
或者是断言“有一个同样强大的替代lambda,过滤,映射和减少,即列表理解”假?

2 个答案:

答案 0 :(得分:2)

怎么样?
G['year'] = ["'{:02d}".format(x % 100) for x in G.year]

答案 1 :(得分:1)

你误解了,论证并不是lambda可以被列表理解取代,而是mapfilter的组合 -  通常涉及lambda - 与列表推导有直接对等关系。 E.G。

list(map(int, list_of_str)) == [int(s) for s in list_of_str]

或者更清洁地使用过滤和映射:

list(map(lambda x:x**2, filter(lambda x: x%2==0, mylist)))

相当于

[x**2 for x in mylist if x%2==0]

lambda创建函数对象,list-comprehensions创建列表对象lambda可以用完整的函数定义替换:

def format_mod(x): 
    return "'{:02d}".format(x % 100)

G['year'].apply(format_mod)

lambda唯一优势在于它是匿名,即它不必分配给名称。