我有一个带有时间索引的数据帧和包含三维向量坐标的3列:
x y z
ts
2014-05-15 10:38 0.120117 0.987305 0.116211
2014-05-15 10:39 0.117188 0.984375 0.122070
2014-05-15 10:40 0.119141 0.987305 0.119141
2014-05-15 10:41 0.116211 0.984375 0.120117
2014-05-15 10:42 0.119141 0.983398 0.118164
我想对每一行应用一个转换,它还返回一个向量
def myfunc(a, b, c):
do something
return e, f, g
但如果我这样做了:
df.apply(myfunc, axis=1)
我最后得到了一个Pandas系列,它的元素是元组。这是因为apply将获取myfunc的结果而不解包。如何更改myfunc以获得包含3列的新df?
编辑:
下面的所有解决方案都有效。序列解决方案确实允许列名,列表解决方案似乎执行得更快。
def myfunc1(args):
e=args[0] + 2*args[1]
f=args[1]*args[2] +1
g=args[2] + args[0] * args[1]
return pd.Series([e,f,g], index=['a', 'b', 'c'])
def myfunc2(args):
e=args[0] + 2*args[1]
f=args[1]*args[2] +1
g=args[2] + args[0] * args[1]
return [e,f,g]
%timeit df.apply(myfunc1 ,axis=1)
100 loops, best of 3: 4.51 ms per loop
%timeit df.apply(myfunc2 ,axis=1)
100 loops, best of 3: 2.75 ms per loop
只需返回一个列表而不是元组。
基于@U2EF1出色的answer,我创建了一个方便的函数,它应用一个指定的函数,该函数将元组返回到dataframe字段,并将结果扩展回dataframe。
用法:
希望它能帮助别人。
返回
Series
并将它们放入数据帧中。这样做的好处是,您可以为每个结果列添加标签。如果返回一个数据帧,它只会为组插入多行。
相关问题 更多 >
编程相关推荐