2015-02-06 56 views
3

我想构建一个使用.shift()的函数,但它给了我一个错误。 考虑一下:为什么我不能在熊猫函数中应用转换?

In [40]: 

data={'level1':[20,19,20,21,25,29,30,31,30,29,31], 
     'level2': [10,10,20,20,20,10,10,20,20,10,10]} 
index= pd.date_range('12/1/2014', periods=11) 
frame=DataFrame(data, index=index) 
frame 

Out[40]: 
      level1 level2 
2014-12-01 20 10 
2014-12-02 19 10 
2014-12-03 20 20 
2014-12-04 21 20 
2014-12-05 25 20 
2014-12-06 29 10 
2014-12-07 30 10 
2014-12-08 31 20 
2014-12-09 30 20 
2014-12-10 29 10 
2014-12-11 31 10 

正常功能工作正常。为了证明我计算的结果相同的两倍,使用直接和功能的方法:

In [63]: 
frame['horizontaladd1']=frame['level1']+frame['level2']#works 

def horizontaladd(x): 
    test=x['level1']+x['level2'] 
    return test 
frame['horizontaladd2']=frame.apply(horizontaladd, axis=1) 
frame 
Out[63]: 
      level1 level2 horizontaladd1 horizontaladd2 
2014-12-01 20 10 30 30 
2014-12-02 19 10 29 29 
2014-12-03 20 20 40 40 
2014-12-04 21 20 41 41 
2014-12-05 25 20 45 45 
2014-12-06 29 10 39 39 
2014-12-07 30 10 40 40 
2014-12-08 31 20 51 51 
2014-12-09 30 20 50 50 
2014-12-10 29 10 39 39 
2014-12-11 31 10 41 41 

不过,虽然直接应用转变的作品,在功能不工作:

frame['verticaladd1']=frame['level1']+frame['level1'].shift(1)#works 

def verticaladd(x): 
    test=x['level1']+x['level1'].shift(1) 
    return test 
frame.apply(verticaladd)#error 

结果

KeyError: ('level1', u'occurred at index level1') 

我也试图申请一个列,这使得更多的意义在我的脑海里,但没有运气:

def verticaladd2(x): 
    test=x-x.shift(1) 
    return test 
frame['level1'].map(verticaladd2)#error, also with apply 

错误:

AttributeError: 'numpy.int64' object has no attribute 'shift' 

为什么不叫直接转移?我需要将它嵌入到一个函数中,以便沿轴1同时计算多个列。请参阅相关问题Ambiguous truth value with boolean logic

回答

2

尝试传递框架的功能,而不是使用apply(我不知道为什么apply无法正常工作,甚至按列):

def f(x): 
    x.level1 
    return x.level1 + x.level1.shift(1) 

f(frame) 

回报:

2014-12-01 NaN 
2014-12-02 39 
2014-12-03 39 
2014-12-04 41 
2014-12-05 46 
2014-12-06 54 
2014-12-07 59 
2014-12-08 61 
2014-12-09 61 
2014-12-10 59 
2014-12-11 60 
Freq: D, Name: level1, dtype: float64 
+0

有在熊猫文档中没有看到这个地方!将继续追求,但这是否与表现一致? – 2015-02-07 20:49:26

+0

我的假设是,这比应用更高性能(如果?)移位和总和是矢量化的。 – JAB 2015-02-07 21:07:21

0

我并不完全遵循,但如果frame ['level1']。shift(1)作品,那么我只能想象,frame ['level1']不是一个numpy.int64对象,而无论你传递给verticaladd函数是什么。可能需要看看你的类型。

相关问题