使用pandas apply和自定义函数返回多列数据

4

假设我有一个函数:

def fn(x)
    y = x ** 2
    z = x ** 3
    return y, z

我希望使用df['x'].apply(lambda x: fn(x))返回分别存储在不同列中的yz。 有没有一种好的方法通过仍然使用fn(x)来实现这一点? 实际上,我的函数会更加复杂 - 所以我只想在应用程序内运行一次,并将output[0]output[1]等分配给单独的列。


6
我认为你可以像这个问题的回答中所做的那样,只需编写df["y"], df["z"] = zip(*df["x"].apply(fn)) - DSM
完美 - 我认为这实际上是有效的。非常感谢! - arosner09
1个回答

3
这种方法怎么样?(注:根据下面的评论,我编辑了这个答案)因此,应用步骤可以采用一个带有共享计算的单个函数,并返回合并步骤所需的系列。
data = {'state':['Ohio','Ohio','Ohio','Nevada','Nevada'], 'year':[2000,2001,2002,2001,2002],'pop':[1.5,1.7,3.6,2.4,2.9]}
frame = pd.DataFrame(data, columns = ['year','state','pop'])
def fn(x,head1,head2):
    y = x ** 2
    z = x ** 3
    return pd.Series({head1:y, head2:z}) 
frame = frame.merge(frame['pop'].apply(lambda s: fn(s,'xsqr','xcube')), left_index=True, right_index=True)

结果:

   year   state  pop   xcube   xsqr
0  2000    Ohio  1.5   3.375   2.25
1  2001    Ohio  1.7   4.913   2.89
2  2002    Ohio  3.6  46.656  12.96
3  2001  Nevada  2.4  13.824   5.76
4  2002  Nevada  2.9  24.389   8.41

谢谢BKay - 问题是我需要使用fn(x)而不是单独的计算,例如s ** 2和s ** 3。 fn(x)相当复杂,因此我无法分别隔离y和z的计算。 - arosner09

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接