可以在pandas apply方法中使用lambda表达式吗?

时间:2017-08-09 14:40:03

标签: python pandas lambda

我今天遇到了这个lambda表达式,无法理解它是如何使用的:

data["class_size"]["DBN"] = data["class_size"].apply(lambda x: "{0:02d}{1}".format(x["CSD"], x["SCHOOL CODE"]), axis=1)

代码行似乎没有调用lambda函数或将任何参数传递给它,所以我很困惑它是如何做任何事情的。这样做的目的是采用两列CSD和SCHOOL CODE,并将每行中的条目组合成一个新行DBN。那个lambda表达式是否会被使用?

4 个答案:

答案 0 :(得分:2)

您将结果错误地写入列。 data["class_size"]["DBN"]不是选择要写入的列的正确方法。您还选择了一个列来使用apply,但您希望在整个数据框中使用该列。

data["DBN"] = data.apply(lambda x: "{0:02d}{1}".format(x["CSD"], x["SCHOOL CODE"]), axis=1)

答案 1 :(得分:1)

pandas Series的apply方法将函数作为其参数之一。

这里有一个简单的例子:

import pandas as pd

data = {"numbers":range(30)}

def cube(x):
    return x**3

df = pd.DataFrame(data)

df['squares'] = df['numbers'].apply(lambda x: x**2)

df['cubes'] = df['numbers'].apply(cube)

print df

给出:

   numbers  squares  cubes
0        0        0      0
1        1        1      1
2        2        4      8
3        3        9     27
4        4       16     64
...

正如您所看到的,定义一个函数(如cube)或使用lambda函数效果非常好。

正如已经指出的那样,如果您的特定代码段出现问题,那么您data["class_size"]["DBN"] = ...的代码不正确。我假设这是一个奇怪的错字,因为你没有提到一个关键错误,这将导致。

如果您对此感到困惑,请考虑:

def list_apply(func, mylist):
    newlist = []
    for item in mylist:
        newlist.append(func(item))

这是一个(不是非常有效的)函数,用于将函数应用于列表中的每个项目。如果您像以前一样将它与立方体一起使用:

a_list = range(10)

print list_apply(cube, a_list)

你得到:

[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]

这是一个关于如何实现pandas中的apply函数的简单示例。我希望有帮助吗?

答案 2 :(得分:1)

您使用的是多索引数据框(即有列层次结构)吗?在没有看到你的数据的情况下很难分辨,但我认为是这种情况,因为只使用data["class_size"].apply()就会产生一个普通数据帧的系列(意味着lambda将无法找到你指定的列和然后就会出错!)

我实际上发现this answer解释了尝试在多索引数据框中创建列的问题,一个令人困惑的事情是多索引列创建是你可以尝试创建一个像你正在做的列和它似乎没有任何问题,但实际上不会创建你想要的。相反,您需要将data["class_size"]["DBN"] = ...更改为data["class_size", "DBN"] = ...所以,完整:

data["class_size","DBN"] = data["class_size"].apply(lambda x: "{0:02d}{1}".format(x["CSD"], x["SCHOOL CODE"]), axis=1)

当然,如果它不是一个多索引数据帧,那么这将无济于事,你应该看看其他答案之一。

答案 3 :(得分:0)

我认为0:02d表示“ CSD”值的小数点后两位。 {} {}基本上将这两个值放在一起形成“ DBN”。