我想应用一个带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给了我一个数据帧,一般来说我怎么知道是否会返回一个系列或数据帧?
documentation对此保持沉默。