How to solve the Attribute error 'float' object has no attribute 'split' in python?
Asked Answered
T

3

23

When I run the below code, it gives me an error saying that there is attribute error: 'float' object has no attribute 'split' in python.

I would like to know why this error comes about.

def text_processing(df):

    """""=== Lower case ==="""
    '''First step is to transform comments into lower case'''
    df['content'] = df['content'].apply(lambda x: " ".join(x.lower() for x in x.split() if x not in stop_words))

    return df

df = text_processing(df)

The full traceback for the error:

Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.2.2\helpers\pydev\pydevd.py", line 1664, in <module>
    main()
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.2.2\helpers\pydev\pydevd.py", line 1658, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.2.2\helpers\pydev\pydevd.py", line 1068, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.2.2\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Users/L31307/Documents/FYP P3_Lynn_161015H/FYP 10.10.18 (Wed) still working on it/FYP/dataanalysis/category_analysis.py", line 53, in <module>
    df = text_processing(df)
  File "C:/Users/L31307/Documents/FYP P3_Lynn_161015H/FYP 10.10.18 (Wed) still working on it/FYP/dataanalysis/category_analysis.py", line 30, in text_processing
    df['content'] = df['content'].apply(lambda x: " ".join(x.lower() for x in x.split() if x not in stop_words))
  File "C:\Users\L31307\AppData\Roaming\Python\Python37\site-packages\pandas\core\series.py", line 3194, in apply
    mapped = lib.map_infer(values, f, convert=convert_dtype)
  File "pandas/_libs/src\inference.pyx", line 1472, in pandas._libs.lib.map_infer
  File "C:/Users/L31307/Documents/FYP P3_Lynn_161015H/FYP 10.10.18 (Wed) still working on it/FYP/dataanalysis/category_analysis.py", line 30, in <lambda>
    df['content'] = df['content'].apply(lambda x: " ".join(x.lower() for x in x.split() if x not in stop_words))
AttributeError: 'float' object has no attribute 'split'
Tannertannery answered 10/10, 2018 at 9:26 Comment(3)
Did you understand why you got the error in the first place? Whatever dataframe you have, its values are float type. But you are calling the string function split on them. How do you expect it to work? Either convert your coloumn or have a check so that split skips columns with float type.Tamelatameless
The error message implies that the column df['content'] contains floats which cannot be split.Ingeborg
I have got the same type of error, and after removing the null values or nan values, using df.dropna(inplace=True) , the above error , no longer exists.Battement
A
25

The error points to this line:

df['content'] = df['content'].apply(lambda x: " ".join(x.lower() for x in x.split() \
                                    if x not in stop_words))

split is being used here as a method of Python's built-in str class. Your error indicates one or more values in df['content'] is of type float. This could be because there is a null value, i.e. NaN, or a non-null float value.

One workaround, which will stringify floats, is to just apply str on x before using split:

df['content'] = df['content'].apply(lambda x: " ".join(x.lower() for x in str(x).split() \
                                    if x not in stop_words))

Alternatively, and possibly a better solution, be explicit and use a named function with a try / except clause:

def converter(x):
    try:
        return ' '.join([x.lower() for x in str(x).split() if x not in stop_words])
    except AttributeError:
        return None  # or some other value

df['content'] = df['content'].apply(converter)

Since pd.Series.apply is just a loop with overhead, you may find a list comprehension or map more efficient:

df['content'] = [converter(x) for x in df['content']]
df['content'] = list(map(converter, df['content']))
Alage answered 10/10, 2018 at 9:32 Comment(1)
This fixes the problem. Thanks. words.split(" ") change to str(words).split(" ")Bolshevik
C
8

split() is a python method which is only applicable to strings. It seems that your column "content" not only contains strings but also other values like floats to which you cannot apply the .split() mehthod.

Try converting the values to a string by using str(x).split() or by converting the entire column to strings first, which would be more efficient. You do this as follows:

df['column_name'].astype(str)
Cinerator answered 10/10, 2018 at 9:34 Comment(0)
P
0

Had the same issue ('float' object has no attribute 'split'), this is how I managed it:

Initial code...:

df = pd.read_excel("Forbes Athlete List 2012-2019.xlsx")
df.Pay = df.Pay.apply(lambda x: float(x.split(" ")[0].split("$")[1]))

...resulted in error: 'float' object has no attribute 'split'

So I changed the code to this:

df.Pay = df.Pay.apply(lambda x: float(x.split(" ")[0].split("$")[1] if type (x) == str else str (x)))

Here is the second example of the same thing:

Initial code that shows error:

df.Endorsements = df.Endorsements.apply(lambda x: float(x.split(" ")[0].split("$")[1]))

Amended code that works fine:

df.Endorsements = df.Endorsements.apply (lambda x: float(x.split(" ")[0].split("$")[1] if type (x) == str else str (x)))

So, you guys having this problem could try adding 'if type (x) == str else str (x)' part in your code, might solve your problem.

Cheers! A.

Photoelasticity answered 6/8, 2022 at 16:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.