2012-09-26 60 views
1

我想在熊貓中使用df.apply()函數,但得到以下錯誤。該函數試圖每個條目轉換爲0,如果是小於「門檻」python熊貓unbound本地錯誤,同時調用函數'df.apply'

from pandas import * 
import numpy as np 
def discardValueLessThan(x, threshold): 
    if x < threshold : return 0 
    else: return x 

df = DataFrame(np.random.randn(8, 3), columns=['A', 'B', 'C']) 

>>> df 
      A   B   C 
0 -1.389871 1.362458 1.531723 
1 -1.200067 -1.114360 -0.020958 
2 -0.064653 0.426051 1.856164 
3 1.103067 0.194196 0.077709 
4 2.675069 -0.848347 0.152521 
5 -0.773200 -0.712175 -0.022908 
6 -0.796237 0.016256 0.390068 
7 -0.413894 0.190118 -0.521194 

df.apply(discardValueLessThan, 0.1) 

>>> df.apply(discardValueLessThan, 0.1) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas-0.8.1-py2.7-macosx-10.5-x86_64.egg/pandas/core/frame.py", line 3576, in apply 
    return self._apply_standard(f, axis) 
    File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas-0.8.1-py2.7-macosx-10.5-x86_64.egg/pandas/core/frame.py", line 3637, in _apply_standard 
    e.args = e.args + ('occurred at index %s' % str(k),) 
UnboundLocalError: local variable 'k' referenced before assignment 

回答

2

該錯誤消息看起來像一個pandas錯誤給我,但我認爲還有兩個其他問題。

首先,我認爲你必須指定命名參數或使用args將其他參數傳遞給apply。你的第二個參數可能被解釋爲一個軸。但是如果你使用

df.apply(discardValueLessThan, args=(0.1,)) 

df.apply(discardValueLessThan, threshold=0.1) 

,那麼你會得到

ValueError: ('The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()', 'occurred at index A') 

因爲apply不作爲的elementwise,它作用於整個系列的對象。其他方法包括使用applymap或布爾索引,即

In [47]: df = DataFrame(np.random.randn(3, 3), columns=['A', 'B', 'C']) 

In [48]: df 
Out[48]: 
      A   B   C 
0 -0.135336 -0.274687 1.480949 
1 -1.079800 -0.618610 -0.321235 
2 -0.610420 -0.422112 0.102703 

In [49]: df1 = df.applymap(lambda x: discardValueLessThan(x, 0.1)) 

In [50]: df1 
Out[50]: 
    A B   C 
0 0 0 1.480949 
1 0 0 0.000000 
2 0 0 0.102703 

或簡單地

In [51]: df[df < 0.1] = 0 

In [52]: df 
Out[52]: 
    A B   C 
0 0 0 1.480949 
1 0 0 0.000000 
2 0 0 0.102703 
+0

軸線是如此0.1確實被解釋爲軸心的第二參數。如果axis不是0或1,我只是推動掌握更多信息的錯誤消息。 –

+0

@ChangShe:是的,我想到的錯誤是有人試圖捕獲NameError,當這不是將拋出的異常。 – DSM

0

你需要調用它像這樣:

df.apply(discardValueLessThan, args=(0.1,))

的方式你這樣做的0.1不作爲參數傳遞給discardValueLessThan。