Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Dataframe应用方法返回多个元素(系列)_Python_Python 2.7_Pandas_Dataframe - Fatal编程技术网

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,我只是想知道确保我没有发疯。我在文档中找不到任何地方证明这是正确的做法,然后才能看到他们改变了它,所以这一切都很不清楚!可能是重复的