Поиск строк в датафрейме, данные которых предоставлены в виде процентов в столбце ratings, и замена значений этих строк в столбце ratings на float

Есть датафрейм data с данными минкультуры о кинопрокате за какой-то промежуток времени. В таблице есть столбец ratings, в нём хранятся рейтинги фильмов (данные взяты с кинопоиска) в виде вещественного числа с округлением до одного знака после запятой, например 9.4. Однако так же встречаются рейтинги в процентах (на кинопоиске это рейтинги ожидания, какой-то объективной оценки они не несут), например 67%. Изначально столбец имеет тип данных object, но его нужно привести к вещественному типу данных. Конечно можно воспользоваться pd.to_numeric(data['ratings'], errors='coerce') и просто проигнорировать все, что с ходу не переводится, но хотелось бы воспользоваться более аккуратным способом.

Я хочу отыскать все строки, которые имеют значения в процентах в столбце ratings и привести их к вещественному типу, например 59% -> 5.9. Я пытался отыскать такие строки с помощью цикла for и конструкции try except следующим образом:

for i in range(len(data.index)):
try:
   data.loc[i, 'ratings'] = data.loc[i, 'ratings'].astype('float64')
except: 
    print(f'Индекс: {i}')

Идея в том, что строки, которые не переводятся в вещественный формат в столбце ratings, должны выдавать свой индекс, но почему-то печатаются просто все индексы по порядку.

Подскажите пожалуйста, как можно реализовать мою задумку? Можно ли реализовать решение данной проблемы вообще без циклов (насколько я знаю при работе с Pandas стоит искать альтернативу циклам) ? И как вы думаете, стоит ли серьезно запариваться по этому поводу или просто воспользоваться методом pd.to_numeric(data['ratings'], errors='coerce'), если им воспользоваться, то получится всего 29 пропусков (помимо изначально пропущенных значений, которых 966), к тому же рейтинги в процентах не несут какой-то прям объективной оценки фильма.


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

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

Зачем вам вообще цикл, если вы работаете с датафреймом и можно обрабатыавть данные векторно?

попробуйте так:

def cnv(s):
    try:
        return float(s)
    except ValueError:
        return float(s.strip("%"))/10

df['ratings'] = df['ratings'].apply(cnv)

теперь df['ratings'].dtypes будет

dtype('float64')

И все. теперь у вас в рейтингах либо float с ректингом приведенным к одному виду, либо NaN

→ Ссылка
Автор решения: passant

Если в одном столбце и проценты и рейтинги, то как после преобразования всего в цифру вы будет разбирать, что такое - например - 5.5 ? Как вообще в одном столбце могуть быть разные по семантике данные? То что их так представляет провайдер данных - ну так он не думает о дальнейшей их обработке.

Поэтому вам надо СНАЧАЛА разделить данные, возможно перенести их в разные столбцы - отдельно рейтинги, отдельно проценты, а уж потом думать об обработке.

Смешивать процентные данные, о которых всегда можно сказать, что объект с Х процентами в X/Y раз лучше, объекта с Y процентами, с данными (рейтинговыми) о которых мы можем сказать только, что один лучше-хуже-равен другому и ничего больше - это одна из главных ошибок, которые допускают неопытные статистики/датааналитики. Это - азы науки о данных, первая лекция, которую многие просто пропускают, особенно те, кто торопиться начать программирование пропустив (ага - за ненадобностью) теорию. А получаемые в итоге результаты могут быть некорректными, а часто вообще безсмысленными.

→ Ссылка