Dataframe Apply方法返回多个元素(系列)

时间:2016-04-13 13:18:57

标签: python python-2.7 pandas dataframe

import pandas as pd

我们说dataframe就像这样:

df = pd.DataFrame({"a":range(4),"b":range(1,5)})

它看起来像这样:

   a  b
0  0  1
1  1  2
2  2  3
3  3  4

和一个将X乘以Y的函数:

def XtimesY(x,y):
    return x*y

如果我想添加一个新的pandas系列,我可以这样做:

df["c"] =df.apply( lambda x:XtimesY(x["a"],2), axis =1)

有效!

现在我要添加多个系列:

我有这个功能:

def divideAndMultiply(x,y):
    return x/y, x*y

这样的事情?:

df["e"], df["f"] = df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1)

它不起作用!

我希望'e'列接收分段,并'f'列进行乘法!

注意:这不是我使用的代码,但我期待相同的行为。

4 个答案:

答案 0 :(得分:13)

几乎就在那里。使用zip *解压缩该功能。试试这个:

def divideAndMultiply(x,y):
    return x/y, x*y

df["e"], df["f"] = zip(*df.a.apply(lambda val: divideAndMultiply(val,2)))

答案 1 :(得分:5)

<强>更新

  

针对0.23版进行了更新 - 使用result_type='broadcast'了解更多详细信息,请参阅documentation

重新定义您的功能:

def divideAndMultiply(x,y):
    return [x/y, x*y]

然后这样做:

df[['e','f']] = df.apply(lambda x: divideAndMultiply(x["a"], 2), axis=1, result_type='broadcast')

您将获得所需的结果:

In [118]: df
Out[118]:
   a  b  e  f
0  0  1  0  0
1  1  2  0  2
2  2  3  1  4
3  3  4  1  6

答案 2 :(得分:0)

df["e"], df["f"] = zip(*df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1))

应该做的伎俩。

(我展示了这个例子,你可以看到如何使用多列作为输入来创建多个新列)

答案 3 :(得分:0)

以下这个令人沮丧的问题的解决方案对我有用。不久前,我在另一个StackOverflow帖子中找到了最初的建议。诀窍是将返回值包装成这样的Series:

def divideAndMultiply(x,y):
    return pd.Series([x/y, x*y])

然后这将按您希望的方式工作:

df[['e','f']] = df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1)