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

YOB*_*OBA 3 python dataframe python-2.7 pandas

import pandas as pd
Run Code Online (Sandbox Code Playgroud)

假设我dataframe喜欢这样:

df = pd.DataFrame({"a":range(4),"b":range(1,5)})
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

   a  b
0  0  1
1  1  2
2  2  3
3  3  4
Run Code Online (Sandbox Code Playgroud)

以及将X乘以Y的函数:

def XtimesY(x,y):
    return x*y
Run Code Online (Sandbox Code Playgroud)

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

df["c"] =df.apply( lambda x:XtimesY(x["a"],2), axis =1)
Run Code Online (Sandbox Code Playgroud)

有用 !

现在我要添加多个系列:

我有这个功能:

def divideAndMultiply(x,y):
    return x/y, x*y
Run Code Online (Sandbox Code Playgroud)

像这样的东西?:

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

它不起作用!

我希望'e'列接收分区并将'f'乘法列列出来!

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

Sam*_*Sam 15

差不多了.使用zip*解压缩该功能.试试这个:

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

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


Abb*_*bas 7

UPDATE

针对版本0.23进行result_type='broadcast'了更新 - 有关详细信息,请参阅文档

像这样重新定义你的函数:

def divideAndMultiply(x,y):
    return [x/y, x*y]
Run Code Online (Sandbox Code Playgroud)

然后这样做:

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

你将获得所需的结果:

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
Run Code Online (Sandbox Code Playgroud)