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'
列进行乘法!
注意:这不是我使用的代码,但我期待相同的行为。
答案 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)