Преобразование объектов в значение int — Ошибка: недопустимый литерал для int() с основанием 10: ‘104,559’

#python #pandas #numpy #python-2.7

Вопрос:

Пытаюсь преобразовать столбец объектов в int, но продолжаю получать сообщения об ошибках.

 dataTypeSeries = mj.dtypes  print(dataTypeSeries)   

Тип данных каждого столбца фрейма данных :

 Region object  Ad_Impressions object  Clicks float64  dtype: object  
 mj["Clicks"] = mj.Clicks.astype(int) print(dataTypeSeries) #Converting the click data   
 Region object  Ad_Impressions object  Clicks int64  dtype: object  

Никаких проблем там нет

 mj['Ad_Impressions'].astype(str).astype(int)  #Try the same with impressions, get this error   

 ValueError Traceback (most recent call last) /var/folders/ky/2j2r1h6d75qf92ks05h9p9180000gn/T/ipykernel_28774/1132458541.py in lt;modulegt; ----gt; 1 mj['Ad_Impressions'].astype(str).astype(int)  /opt/anaconda3/lib/python3.9/site-packages/pandas/core/generic.py in astype(self, dtype, copy, errors)  5813 else:  5814 # else, only a single dtype is given -gt; 5815 new_data = self._mgr.astype(dtype=dtype, copy=copy, errors=errors)  5816 return self._constructor(new_data).__finalize__(self, method="astype")  5817   /opt/anaconda3/lib/python3.9/site-packages/pandas/core/internals/managers.py in astype(self, dtype, copy, errors)  416   417 def astype(self: T, dtype, copy: bool = False, errors: str = "raise") -gt; T: --gt; 418 return self.apply("astype", dtype=dtype, copy=copy, errors=errors)  419   420 def convert(  /opt/anaconda3/lib/python3.9/site-packages/pandas/core/internals/managers.py in apply(self, f, align_keys, ignore_failures, **kwargs)  325 applied = b.apply(f, **kwargs)  326 else: --gt; 327 applied = getattr(b, f)(**kwargs)  328 except (TypeError, NotImplementedError):  329 if not ignore_failures:  /opt/anaconda3/lib/python3.9/site-packages/pandas/core/internals/blocks.py in astype(self, dtype, copy, errors)  589 values = self.values  590  --gt; 591 new_values = astype_array_safe(values, dtype, copy=copy, errors=errors)  592   593 new_values = maybe_coerce_values(new_values)  /opt/anaconda3/lib/python3.9/site-packages/pandas/core/dtypes/cast.py in astype_array_safe(values, dtype, copy, errors)  1307   1308 try: -gt; 1309 new_values = astype_array(values, dtype, copy=copy)  1310 except (ValueError, TypeError):  1311 # e.g. astype_nansafe can fail on object-dtype of strings  /opt/anaconda3/lib/python3.9/site-packages/pandas/core/dtypes/cast.py in astype_array(values, dtype, copy)  1255   1256 else: -gt; 1257 values = astype_nansafe(values, dtype, copy=copy)  1258   1259 # in pandas we don't store numpy str dtypes, so convert to object  /opt/anaconda3/lib/python3.9/site-packages/pandas/core/dtypes/cast.py in astype_nansafe(arr, dtype, copy, skipna)  1172 # work around NumPy brokenness, #1987  1173 if np.issubdtype(dtype.type, np.integer): -gt; 1174 return lib.astype_intsafe(arr, dtype)  1175   1176 # if we have a datetime/timedelta array of objects  /opt/anaconda3/lib/python3.9/site-packages/pandas/_libs/lib.pyx in pandas._libs.lib.astype_intsafe()  ValueError: invalid literal for int() with base 10: '104.559'  

Комментарии:

1. '104.559' представляет собой строку с плавающей точкой.

2. Ошибка уже говорит об этом: ваши данные имеют 104.559 то, что не может быть истолковано как int .

3. В чем здесь вопрос? Конечно, строка '104.559' не может быть проанализирована как целое число

4. Как я могу сделать это int ?

5. Сделайте mj['Ad_Impressions'].astype(float).astype(int) это , но будьте осторожны, что это сократит все ваши поплавки (т. Е. «9.99» станет 9, а не 10). Если вы хотите округлить до ближайшего целого числа, выполните: mj['Ad_Impressions'] = mj['Ad_Impressions'].map(lambda x: int(round(float(x))))