Язык программирования Python

Как найти символы перед “.” в строке, внутри столбца DataFrame.

Вопрос.

Я новичок в программировании и, возможно, этот вопрос глупый, но у меня есть DataFrame с 23 столбцами и примерно 890 строками.

Мне нужно, чтобы в одном из этих столбцов (который содержит: “Кап. Иванов”, “Мист. Петров”, “Мис. Сидорова”, “Кап. Васечкин”) чтобы была фильтрация и возвращалось то, что идет перед точкой, то есть Кап, Мист и Мис.

Вот что я сделал на данный момент.

Я получаю булевы значения, только если есть точка. Тогда, поскольку весь столбец содержит точки, он возвращает все значения в True, поэтому я не фильтрую правильно столбец.

Столбец, из которого я хочу извлечь отфильтрованные данные, – ‘Name’.

import pandas as pd import re df = pd.read_csv('train.csv') df.Name.str.contains(r"^([^.]*).*")
Code language: JavaScript (javascript)

Это приводит к следующему:

0 True 1 True 2 True 3 True 4 True
Code language: PHP (php)

а я хочу получить:

0 Кап 1 Мист 2 Мис 3 Мис 4 Кап

Решение.

Первое, что вам нужно сделать, это написать функцию, которая получает в качестве параметра полную строку, например, “Иванов, Мист. Петр Петров” и, выполняя операции, которые вам нужны, возвращает только ту часть, которая вас интересует (“Мист” в данном случае).

Как только вы написали эту функцию, просто скажите pandas применить ее к интересующему вас столбцу, используя .apply().

Написание функции.

Здесь вы можете применить тот механизм или эвристику, который считаете наиболее подходящим для ваших данных. Например, простая схема может быть следующей:

  1. Я делю строку на первую появившуюся точку. Так, в приведенном выше примере он будет разделен на две части: “Иванов, Мист” на одной стороне и “Петр Петров” на другой.
  2. Из первой части возьмем последнее слово (“Мист”).

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

Но давайте придерживаться простой схемы эвристики, которую я предложил, хотя бы в качестве примера.

Реализуем функцию следующим образом:

def extract_process(name): if "." not in name: return "" # Разделение первой точкой left, right = name.split(".", 1) # возвращение последнего слова в левой части return left.split()[-1]
Code language: PHP (php)

Применение к столбцу

Самая простая часть:

>>> df.Name.apply(extract_process) 0 1 Мист 2 Мис 3 Мистs 4 Мист ... 887 Мис 888 Мис 889 Мист 890 Мист Name: Name, Length: 891, dtype: object
Code language: CSS (css)

В качестве проверки вы можете применить функцию unique() к приведенному выше результату, чтобы посмотреть, в каких случаях результат был найден. Выходит:

['Мистстт, 'Мистs, 'Мис, 'Мастстт, 'Кап]
Code language: JSON / JSON with Comments (json)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *