Python Dataframe应用方法返回多个元素(系列)
假设我有一个Python Dataframe应用方法返回多个元素(系列),python,python-2.7,pandas,dataframe,Python,Python 2.7,Pandas,Dataframe,假设我有一个数据帧,如下所示: import pandas as pd 看起来是这样的: df = pd.DataFrame({"a":range(4),"b":range(1,5)}) df["e"], df["f"] = df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1) df["e"], df["f"] = zip(*df.apply( lambda x: divideAndMultiply(x["a"],2) , a
数据帧
,如下所示:
import pandas as pd
看起来是这样的:
df = pd.DataFrame({"a":range(4),"b":range(1,5)})
df["e"], df["f"] = df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1)
df["e"], df["f"] = zip(*df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1))
和一个X乘以Y的函数:
a b
0 0 1
1 1 2
2 2 3
3 3 4
如果我想向df添加新的熊猫系列,我可以:
def XtimesY(x,y):
return x*y
它起作用了
现在我想添加多个系列:
我有这个功能:
df["c"] =df.apply( lambda x:XtimesY(x["a"],2), axis =1)
像这样的
def divideAndMultiply(x,y):
return x/y, x*y
它不起作用
我希望'e'
列接收除法,'f'
列接收乘法
注意:这不是我正在使用的代码,但我希望有相同的行为。更新 更新版本0.23-使用
result\u type='broadcast'
有关更多详细信息,请参阅
重新定义函数,如下所示:
df = pd.DataFrame({"a":range(4),"b":range(1,5)})
df["e"], df["f"] = df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1)
df["e"], df["f"] = zip(*df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1))
然后这样做:
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')
差不多了。使用zip*解包函数。试试这个:
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
我们应该做到这一点
(我展示了这个示例,这样您就可以看到如何使用多个列作为输入来创建多个新列)下面这个令人沮丧的问题的解决方案对我很有用。不久前,我在另一个StackOverflow帖子中找到了最初的建议。诀窍是将返回值包装成如下序列:
df = pd.DataFrame({"a":range(4),"b":range(1,5)})
df["e"], df["f"] = df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1)
df["e"], df["f"] = zip(*df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1))
然后,这就可以满足您的需要:
def divideAndMultiply(x,y):
return pd.Series([x/y, x*y])
我已经多次看到这个答案,但每次我尝试,我都会得到
KeyError:“['e','f']索引中没有。我想熊猫一定已经改变了,它对你仍然有效吗@Abbas?它仍然有效。按照问题和答案复制结果。它没有,在python3.6和pandas 0.23.1上没有-KeyError
@seaders你是对的,这个答案在0.23.1中不起作用&这个答案很有效@Abbas,我只是想知道确保我没有发疯。我在文档中找不到任何地方证明这是正确的做法,然后才能看到他们改变了它,所以这一切都很不清楚!可能是重复的