avatar
Мир аналитика данных
@analysts_world
23.08.2023 10:30
👀 Розыск регулярных выражений
⁉️ Озадачили тут меня недавно запросом. Реально ли найти клиентов (account_id) у которых более 70% пользователей с именами на латинице.

- Конечно реально, - ответила я и принялась вспоминать гуглить регулярные выражения. Регулярка- это некий шаблон, по которому фильтруется текст. В Python для работы с регулярными выражениями используют модуль re.
^ - Соответствует началу строки.
[a-zA-Z] — любая буква на латинице в нижнем и верхнем регистре;
[0-9] — любая цифра от нуля до девяти

🔹 Как пример:
import re
s = "Yelena_Shon"
search =
re.search(r'[a-zA-Z0-9]', s)
print(search)
Код выдаст <_sre.SRE_Match object; span=(0, 1), match='Y'>

🔹Еще вариант:
s = "Иван Петров"
search =
re.search(r'[a-zA-Z0-9]', s)
print(search)
А этот код выдаст None
Но нам нужно как-то это применить в датафрейме, а не просто к строке, поэтому воспользуемся в дальнейшем apply.

🔥 Итак, я выкачала юзеров в датафрейм all_users со столбцами account_id, user_id, full_name.
Создадим столбец 'check_name', в котором будем записывать результат проверки
all_users['check_name']= all_users['full_name'].apply(lambda x: re.search(r'^[a-zA-Z0-9]',str(x))).fillna(0)

Затем отбираем там, где не ноль, чтобы потом посчитать юзеров написанных на латинице
all_eng_users = all_users[all_users['check_name']!=0]

Делаем группировку по аккаунтам c подсчетом количества пользователей (user_id) и создаем датафрейм count_eng_users. В нем будет две колонки: номера клиента-account_id и кол-во пользователей, написанных на латинице:
count_eng_users = all_eng_users.groupby('account_id', as_index = False).agg({'user_id':'count'}).rename(columns ={'user_id':'eng_count_users'})

Теперь то же самое сделаем, чтобы подсчитать сколько в аккаунтах есть пользователей не на латинице (то есть на русском языке, вариант “на китайском” автоматически отбрасываем, вряд ли такие есть вообще).

all_rus_users = all_users[all_users['check_name']==0]
count_rus_users = all_rus_users.groupby('account_id', as_index = False).agg({'user_id':'count'}).rename(columns ={'user_id':'rus_count_users'})

Далее объединяем эти две получившиеся таблички по account_id.
users_merged = pd.merge(count_rus_users, count_eng_users, on = ['account_id'], how = 'outer').fillna(0)

В результате получим табличку users_merged с колонками: account_id, rus_count_users, eng_count_users
Посчитаем % :
users_merged['% иностранных пользователей'] = round(((users_merged['eng_count_users']/(users_merged['eng_count_users']+users_merged['rus_count_users']))*100),1)

🚀 Ну и зафиналим. Отберем те аккаунты, у которых у которых более 70% пользователей с именами на латинице:
df_eng_name_users_more70 = users_merged[users_merged['% иностранных пользователей']>=70]

А вот тут можно потренироваться с регулярками:
🔹www.regextester.com
🔹regex101.com

Если Вам нравится, что я привожу рабочие примеры, то ставьте лайки👍, огонечки 🔥 и прочее.
Очень много блогов, где есть ссылки на статьи, какие-то примеры с питоном и sql, но почти не встречала, чтобы аналитики показывали свой код, какие-то задачи с работы. Надеюсь, Вы это оцените ❤️
👍 54
🔥 27
16 2.8K

Обсуждение 0

Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.

Обсудить в Telegram