簡體   English   中英

將 function 應用於 Pandas 中的數據幀返回 UnboundLocalError

[英]Applying function to a data frame in Pandas returns UnboundLocalError

我的 dataframe 看起來像這樣:

        Name    Overall Rating  Value in Millions
0   Neymar Jr   92  €105.5M
1   L. Messi    94  €95.5M
2   K. Mbappé   89  €93.5M
3   V. van Dijk     91  €90M
4   K. De Bruyne    91  €90M
...     ...     ...     ...
19692   I. Isa  63  €0
19693   I. Fetfatzidis  74  €0
19694   M. Mohsen   66  €0
19695   B. Jokič    72  €0
19696   B. Sigurðarson  73  €0

我正在嘗試將 function 應用於第三列“以百萬為單位的值”,以將值從字符串格式轉換為浮點數:

#A function to convert the values in the third row from strings to floats
    
def value_to_float(value_as_string): # eg.'€95.5M'
    
    value_as_string = value_as_string.strip('€')   
    
    if 'M' in value_as_string:                       #95.5M - string
        value_as_string = value_as_string.strip('M') #95.5 - string
        multiplier = float(value_as_string)          #95.5 - float
        value_as_float = multiplier * 1000000        #95000000.0 - float
        
    if 'K' in value_as_string:
        value_as_string = value_as_string.strip('K') 
        multiplier = float(value_as_string)
        value_as_float = multiplier * 1000           #Same as above, in case of K(Thousands)
        
    return value_as_float

給定顯式參數時,function 可以正常工作:

value_to_float('€95.5M')

95500000.0

但是,當我嘗試以下操作時:

players["Value in Millions"].apply(value_to_float)

我收到此錯誤:

---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-80-3d3345f9405d> in <module>
----> 1 players["Value in Millions"].apply(value_to_float)

~/anaconda3/lib/python3.7/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   3846             else:
   3847                 values = self.astype(object).values
-> 3848                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   3849 
   3850         if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-61-158745b17930> in value_to_float(value_as_string)
     15         value_as_float = multiplier * 1000           #Same as above, in case of K(Thousands)
     16 
---> 17     return value_as_float

UnboundLocalError: local variable 'value_as_float' referenced before assignment

我嘗試了其他幾種方法(series.map(),oldschool looping),但我總是得到同樣的錯誤,所以我傾向於認為某處的邏輯存在差距。

您的問題源於您的 function 假設所有行的“價值以百萬計”的值中都有“M”或“K”。 在您自己的 dataframe 示例中,我們可以清楚地看到“百萬價值”為“0 歐元”的示例。 遵循 function 邏輯, value_as_float 變量永遠不會被設置,因此它會引發您概述的錯誤。

調整您的 function 以將 value_as_float 默認設置為 0 可以解決此問題。

def value_to_float(value_as_string): # eg.'€95.5M'
    
    value_as_string = value_as_string.strip('€')
    value_as_float = 0
    
    if 'M' in value_as_string:                       #95.5M - string
        value_as_string = value_as_string.strip('M') #95.5 - string
        multiplier = float(value_as_string)          #95.5 - float
        value_as_float = multiplier * 1000000        #95000000.0 - float
        
    if 'K' in value_as_string:
        value_as_string = value_as_string.strip('K') 
        multiplier = float(value_as_string)
        value_as_float = multiplier * 1000           #Same as above, in case of K(Thousands)
        
    return value_as_float

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM