![](/img/trans.png)
[英]UnboundLocalError when applying a custom function with multiple arguments to a pandas column
[英]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.