Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.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 如何要求apply返回数据帧而不是序列_Python_Pandas - Fatal编程技术网

Python 如何要求apply返回数据帧而不是序列

Python 如何要求apply返回数据帧而不是序列,python,pandas,Python,Pandas,我想应用一个函数,它接受4个值并返回两个值,然后用这个函数填充数据框中的两列 def gendata(): for a in (0,1,NAN): for b in (0,1,NAN): for c in (0,1,NAN): yield a,b,c values = list(gendata()) index = np.arange(len(values))+999 df = pd.DataFrame(values

我想应用一个函数,它接受4个值并返回两个值,然后用这个函数填充数据框中的两列

def gendata():
    for a in (0,1,NAN):
        for b in (0,1,NAN):
            for c in (0,1,NAN):
                yield a,b,c
values = list(gendata())
index = np.arange(len(values))+999
df = pd.DataFrame(values, columns=["a","b","c"], index=index)
使:

        a    b    c
999   0.0  0.0  0.0
1000  0.0  0.0  1.0
1001  0.0  0.0  NaN
...
选择两列并应用于返回包含两个元素的列表的函数会生成一个包含两列的数据框:

def f2to2(x):
    a,b = x
    return [a+b, a*b]

result = df[["a", "b"]].apply(f2to2, axis=1)
print result
        a    b
999   0.0  0.0
1000  0.0  0.0
1001  0.0  0.0
可以将其分配到数据帧中,如下所示:

df[['x','y']] = result
但选择四列并应用于返回包含两个元素的列表的函数会给我带来一系列对象:

def f4to2(x):
    lpos, lneg, rpos, rneg = x
    return [lpos+lneg, rpos+rneg]

print df[["a", "b", "c", "a"]].apply(f4to2, axis=1)
999     [0.0, 0.0]
1000    [0.0, 1.0]
1001    [0.0, nan]
...
dtype: object
而下面的方法失败了

df[['x','y']] = result
因为结果是一个系列,其中两个系列是分配所必需的

为什么应用f4to2会给我一个系列,而f2to2会给我一个数据帧,通常我如何知道是否会返回一个系列或数据帧


政府对此保持沉默。

现在,这很有趣。传递两列它返回一个数据帧,传递四列它返回一个序列。您可以通过
return pd.Series([lpos+lneg,rpos+rneg])
强制f4to2返回数据帧是的,但这给了我很多系列(每行一个)。我只想得到两个。我得到了一个包含两列的数据帧,当我用pd.Series.Yes包装返回时,您可以将其从f4to2分配给列“x”和“y”。是的,但它为1M行构造了2M系列对象。现在,这很有趣。传递两列它返回一个数据帧,传递四列它返回一个序列。您可以通过
return pd.Series([lpos+lneg,rpos+rneg])
强制f4to2返回数据帧是的,但这给了我很多系列(每行一个)。我只想得到两个。我得到了一个包含两列的数据帧,当我用pd.Series.Yes包装返回时,可以从f4to2分配给列“x”和“y”,但它为1M行构造了2M系列对象。