Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeError: unsupported operand type(s) for &: 'float' and 'numpy.float64' [duplicate]

I'm trying to convert a continuous variable to a categorical variable using the following code:

def score_to_categorical(x):
    if x<0.25:
        return 'very bad'
    if x>=0.25 & x<0.5:
        return 'bad'
    if x>=0.5 & x<0.75:
        return 'good'
    else:
        return 'very good'

ConceptTemp['Score'] = ConceptTemp['Score'].apply(score_to_categorical)
ConceptTemp1['Score'] = ConceptTemp1['Score'].apply(score_to_categorical)

but I get the following error:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-72-7ec42b055d4f> in <module>()
----> 1 ConceptTemp['Score'] = ConceptTemp['Score'].apply(score_to_categorical)
      2 ConceptTemp1['Score'] = ConceptTemp1['Score'].apply(score_to_categorical)

E:\Anaconda2\lib\site-packages\pandas\core\series.pyc in apply(self, func, convert_dtype, args, **kwds)
   2167             values = lib.map_infer(values, lib.Timestamp)
   2168 
-> 2169         mapped = lib.map_infer(values, f, convert=convert_dtype)
   2170         if len(mapped) and isinstance(mapped[0], Series):
   2171             from pandas.core.frame import DataFrame

pandas\src\inference.pyx in pandas.lib.map_infer (pandas\lib.c:62578)()

<ipython-input-11-1c4f9c7bfafe> in score_to_categorical(x)
     10     if x<0.25:
     11         return 'very bad'
---> 12     if x>=0.25 & x<0.5:
     13         return 'bad'
     14     if x>=0.5 & x<0.75:

TypeError: unsupported operand type(s) for &: 'float' and 'numpy.float64'

I would've though that float and numpy.float64 would be compatible but that doesn't seem to be the case.

Any help in this regard would be much appreciated.

TIA.

like image 439
Patthebug Avatar asked Jun 14 '16 17:06

Patthebug


1 Answers

Here x>=0.25 & x<0.5 & performs a bitwise AND operation (for example, 1 & 52 is zero, which will be treated as False), while you certainly meant to check whether both x>=0.25 and x<0.5 are true.

So, do this:

x>=0.25 and x<0.5

The same mistake is on the next line.

like image 187
ForceBru Avatar answered Nov 13 '22 20:11

ForceBru