2015-02-06 107 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函數是什麼。可能需要看看你的類型。