我想構建一個使用.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
有在熊貓文檔中沒有看到這個地方!將繼續追求,但這是否與表現一致? – 2015-02-07 20:49:26
我的假設是,這比應用更高性能(如果?)移位和總和是矢量化的。 – JAB 2015-02-07 21:07:21