Ошибка: invalid literal for int() with base 10: 'No'

Написала этот код:

data["Отток"] = data["Отток"].astype(int)
Y = data["Отток"].values
X = data.drop(labels = ["Отток"],axis = 1)
#Создаем тренировочные и тестовые данные
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=101)

Выдает ошибку:

ValueError                                Traceback (most recent call last)
<ipython-input-11-369c4aa98463> in <module>
----> 1 data["Отток"] = data["Отток"].astype(int)
      2 Y = data["Отток"].values
      3 X = data.drop(labels = ["Отток"],axis = 1)
      4 #Создаем тренировочные и тестовые данные
      5 from sklearn.model_selection import train_test_split

~\anaconda3\lib\site-packages\pandas\core\generic.py in astype(self, dtype, copy, errors)
   5696         else:
   5697             # else, only a single dtype is given
-> 5698             new_data = self._data.astype(dtype=dtype, copy=copy, errors=errors)
   5699             return self._constructor(new_data).__finalize__(self)
   5700 

~\anaconda3\lib\site-packages\pandas\core\internals\managers.py in astype(self, dtype, copy,                 errors)
    580 
    581     def astype(self, dtype, copy: bool = False, errors: str = "raise"):
--> 582         return self.apply("astype", dtype=dtype, copy=copy, errors=errors)
    583 
    584     def convert(self, **kwargs):

~\anaconda3\lib\site-packages\pandas\core\internals\managers.py in apply(self, f, filter,         **kwargs)
    440                 applied = b.apply(f, **kwargs)
    441             else:
--> 442                 applied = getattr(b, f)(**kwargs)
    443             result_blocks = _extend_blocks(applied, result_blocks)
    444 

~\anaconda3\lib\site-packages\pandas\core\internals\blocks.py in astype(self, dtype, copy,         errors)
    623             vals1d = values.ravel()
    624             try:
--> 625                 values = astype_nansafe(vals1d, dtype, copy=True)
    626             except (ValueError, TypeError):
    627                 # e.g. astype_nansafe can fail on object-dtype of strings

~\anaconda3\lib\site-packages\pandas\core\dtypes\cast.py in astype_nansafe(arr, dtype, copy, skipna)
    872         # work around NumPy brokenness, #1987
    873         if np.issubdtype(dtype.type, np.integer):
--> 874             return lib.astype_intsafe(arr.ravel(), dtype).reshape(arr.shape)
    875 
    876         # if we have a datetime/timedelta array of objects

pandas\_libs\lib.pyx in pandas._libs.lib.astype_intsafe()

ValueError: invalid literal for int() with base 10: 'No'

Подскажите, как исправить?


Ответы (2 шт):

Автор решения: MaxU

У вас в столбце data["Отток"] встречаются нечисловые значения, такие как "No".

В этом случае можно воспользоваться методом pd.to_numeric(column, errors="coerce") - это превратит в NaN все значения, которые невозможно превратить в числа.

Пример:

In [202]: df = pd.DataFrame({"a": ["1.23", "No", "3.14", None, ""]})

In [203]: df
Out[203]:
      a
0  1.23
1    No
2  3.14
3  None
4

In [204]: df["a_num"] = pd.to_numeric(df["a"], errors="coerce")

In [205]: df
Out[205]:
      a  a_num
0  1.23   1.23
1    No    NaN
2  3.14   3.14
3  None    NaN
4          NaN

In [206]: df.dtypes
Out[206]:
a         object
a_num    float64
dtype: object
→ Ссылка
Автор решения: Ксения

Вот так получилось!

    pd.isnull(data)
    data.fillna(data.mean())
    data["Отток1"] = pd.to_numeric(data["Отток"],errors="coerce")
    data = data.fillna(0)
  
    data["Отток1"] = data["Отток1"].astype(int)
    Y = data["Отток1"].values
    X = data.drop(labels = ["Отток1"],axis = 1)
    #Создаем тренировочные и тестовые данные
    from sklearn.model_selection import train_test_split
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=101)
→ Ссылка