Как разделить столбец на два новых - с учётом того, какие данные внутри одной ячейки (строки) этого столбца?

У меня есть Series. В этом Series набор данных (рейтинг фильмов). Было обнаружено, что рейтинг фильмов имеет 2 типа: 1 тип - оценка пользователей (от 0 до 10); 2 тип - процент положительных рецензий. Получается, что в каждой строке указан либо 1, либо 2 тип рейтинга. Я пытаюсь додуматься, как разделить эти два типа рейтинга между собой, чтобы потом можно было анализировать остальной фрейм данных с учётом типа рейтинга. Для лучшего понимания приведу как пример уникальные значения этого Series:

df['ratings'].unique()

array(['7.2', '6.6', '6.8', '7.7', '8.3', '8.0', '7.8', '8.1', '7.1', '6.0', '7.4', '5.8', '8.7', '6.3', '6.9', '5.0', '4.3', '7.3', '7.0', '6.4', 0, '8.2', '7.5', '6.7', '7.9', '5.9', '6.2', '5.6', '6.5', '2.4', '7.6', '6.1', '8.6', '8.5', '8.8', '5.5', '5.1', '5.7', '5.4', '99%', '4.4', '4.5', '5.3', '4.1', '8.4', '2.6', '3.8', '4.6', '4.8', '4.0', '3.0', '1.6', '4.2', '5.2', '4.7', '4.9', '3.9', '2.7', '3.3', '2.9', '28%', '3.7', '1.4', '3.1', '97%', '3.5', '3.2', '2.8', '1.5', '2.1', '2.5', '9.2', '3.4', '1.1', '3.6', '83%', '64%', '91%', '94%', '62%', '79%', '90%', '19%', '88%', '1.0', '89%', '1.3', '1.9', '1.8', '1.2', '1.7', '9.0', '98%', '8.9', '9.1'], dtype=object)

Я так думаю, что, возможно, нужна какая-то своя новая функция? Но не выходит написать что-то нормальное, рабочее.


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

Автор решения: DiMithras
arr = pd.Series(['7.2', '6.6', '6.8'…
df = pd.DataFrame(arr)
df[1] = df[0].str.contains('%', na=False)
df
Вывод:

    0   1
0   7.2 False
1   6.6 False
2   6.8 False
... ... ...
92  98% True
93  8.9 False
94  9.1 False
95 rows × 2 columns

df[0][df[1]]:

39    99%
60    28%
64    97%
     ... 
83    88%
85    89%
92    98%
Name: 0, Length: 14, dtype: object

df[0][~df[1]]

0     7.2
1     6.6
2     6.8
     ... 
91    9.0
93    8.9
94    9.1
Name: 0, Length: 81, dtype: object
→ Ссылка
Автор решения: Алексей Р

По-моему, для единообразного подхода к анализу рейтинга проще привести все к "одному знаменателю". Например, проценты к баллам. Т.е. 99% станут 9.9 баллов. Также, поскольку во фрейме - текстовое представление чисел, его целесообразно конвертировать во float для возможности обработки как чисел (сравнения, сортировки, фильтрации, усреднения и т.д.).

df = pd.DataFrame({'ratings': ['7.2', '6.6', '6.8', '7.7', '8.3', '8.0', '7.8', '8.1', '7.1', '6.0', '7.4', '5.8',
                               '8.7', '6.3', '6.9', '5.0', '4.3', '7.3', '7.0', '6.4', '0', '8.2', '7.5', '6.7', '7.9',
                               '5.9', '6.2', '5.6', '6.5', '2.4', '7.6', '6.1', '8.6', '8.5', '8.8', '5.5', '5.1',
                               '5.7', '5.4', '99%', '4.4', '4.5', '5.3', '4.1', '8.4', '2.6', '3.8', '4.6', '4.8',
                               '4.0', '3.0', '1.6', '4.2', '5.2', '4.7', '4.9', '3.9', '2.7', '3.3', '2.9', '28%',
                               '3.7', '1.4', '3.1', '97%', '3.5', '3.2', '2.8', '1.5', '2.1', '2.5', '9.2', '3.4',
                               '1.1', '3.6', '83%', '64%', '91%', '94%', '62%', '79%', '90%', '19%', '88%', '1.0',
                               '89%', '1.3', '1.9', '1.8', '1.2', '1.7', '9.0', '98%', '8.9', '9.1']})
df.loc[mask, 'ratings'] = df.loc[(mask := df.ratings.str.endswith('%')), 'ratings'].str.strip('%').astype(float).div(10)
df.ratings = df.ratings.astype(float)
→ Ссылка