Как обработать ошибку при преобразовании значений?
Подскажите, как обработать ошибку при преобразовании значений в числовые?
Хочу при вызове исключения удалять строку по ошибке. Но ошибка возвращает мне позицию, а не индекс (у меня индексы - это глобальные Id).
try:
sdf[['Lat','Lon']] = sdf[['Lat','Lon']].apply(pd.to_numeric)
except ValueError as e:
if e:
print(sdf.iloc[int((str(e).split(' '))[-1])])
#Вероятное это рефачится
Как мне получить индекс строки от ошибки, или как удалить строку по позиции?
В исходном CSV есть строки, которые повторяют заголовки столбцов. Lan и Lon тут координаты.
Источник данных.
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Воспользуйтесь параметром pd.to_numeric(..., errors="coerce") - он превратит все значения, которые не удалось преобразовать в числа, в NaN.
Пример:
In [12]: df = pd.read_csv("/tmp/data-9776-2020-12-21.csv", sep=";", encoding="cp1251")
In [13]: cols = ["Latitude_WGS84", "Longitude_WGS84"]
In [14]: df[cols] = df[cols].apply(pd.to_numeric, errors="coerce")
In [15]: df.dtypes
Out[15]:
Latitude_WGS84 float64
Name object
AdmArea object
District object
Location object
NumberOfAccessPoints object
WiFiName object
CoverageArea object
FunctionFlag object
AccessFlag object
Password object
Longitude_WGS84 float64
global_id object
geoData object
Unnamed: 14 float64
dtype: object
In [16]: df[cols].isna().sum()
Out[16]:
Latitude_WGS84 2
Longitude_WGS84 2
dtype: int64
In [17]: df.shape
Out[17]: (2866, 15)
удаляем строки с NaN и проверяем:
In [18]: df = df.dropna(subset=cols)
In [19]: df.shape
Out[19]: (2864, 15)
In [20]: df[cols].isna().sum()
Out[20]:
Latitude_WGS84 0
Longitude_WGS84 0
dtype: int64