Как обработать ошибку при преобразовании значений?

Подскажите, как обработать ошибку при преобразовании значений в числовые?

Хочу при вызове исключения удалять строку по ошибке. Но ошибка возвращает мне позицию, а не индекс (у меня индексы - это глобальные 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
→ Ссылка