Применение функции к фрейму данных в Pandas возвращает UnboundLocalError - PullRequest
0 голосов
/ 05 августа 2020

Мой фрейм данных выглядит так:

        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

Я пытаюсь применить функцию к 3-му столбцу «Значение в миллионах», чтобы преобразовать значения из строкового формата в числа с плавающей запятой:

#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

Функция работает правильно, если задан явный параметр:

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), но всегда получаю одну и ту же ошибку, поэтому я склонен думать, что где-то в logi c пробел.

1 Ответ

0 голосов
/ 05 августа 2020

Ваша проблема возникает из-за того, что ваша функция предполагает, что все строки имеют «M» или «K» в своих значениях для «Значение в миллионах». В приведенном выше примере вашего собственного фрейма данных мы можем ясно видеть примеры, в которых «Стоимость в миллионах» равна «0 евро». После функции logi c переменная value_as_float никогда не устанавливается, поэтому она вызывает указанную вами ошибку.

Настройка вашей функции для установки 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...