2015-02-11 43 views
7

我已经签出地图,申请,mapapply,并结合,但似乎无法找到一个简单的方法做到以下几点:如何在熊猫中使用多列来映射函数?

我有一个数据框10列。我需要他们三人进入这需要标量和返回一个标量函数...

some_func(int a, int b, int c) returns int d 

我想申请这一点,并在其结果数据帧创建一个新列。

df['d'] = some_func(a = df['a'], b = df['b'], c = df['c']) 

所有这一切我已经找到了解决方案,似乎表明以some_func改写与系列,而不是标量的工作,但因为它是另一个软件包的一部分,这是不可能的。我如何优雅地做到上述?

+1

这取决于你的功能正在做的事情,但通常你会做这样的事'高清FUNC(行):返回行[“一”] *行[“b”] *行[ 'c'] df.apply(lambda行:func(row),axis = 1)'理想情况下y ou想要以某种方式编写函数,以便它可以在整个系列上运行,因此它可以被矢量化,能够显示你真正想要做什么 – EdChum 2015-02-11 14:48:23

+0

如果你的函数将'Series'作为参数,那么你可以将其重写为'def some_func(a,b,c):return a * b * c df ['d'] = some_func(df ['a'],df ['b'],df ['c'])' – EdChum 2015-02-11 14:50:48

+0

“ some_func“是一个复杂的函数,它使SQL调用来填充数据,所以我在这里简化了它。建议使用df.apply。 – ashishsingal 2015-02-11 16:50:27

回答

10

使用pd.DataFrame.apply(),如下:

df['d'] = df.apply(lambda x: some_func(a = x['a'], b = x['b'], c = x['c']), axis=1) 

注意:作为@ashishsingal询问列,则axis参数应被提供有值1,作为默认为0(如在documentation和下面复制)。

轴:{0或 '索引',1或 '列'},默认0

  • 0或 '索引':应用函数到每个列
  • 或 '列':应用函数每一行
3

我使用了以下内容:

df['d'] = df.apply(lambda x: some_func(a = x['a'], b = x['b'], c = x['c'])) 

似乎运作良好,但如果其他人有更好的解决方案,请让我知道。