Ищем строки с заданным вхождением в Python или дело о послании с «Титаника»!

Потренируемся в анализе данных: отыщем строки с заданным вхождением в Python?! У нас как раз появилась интересная задачка — нужно помочь исследователям найти информацию о девочке по имени Матильда Лефевр, которая была пассажиром «Титаника», потерпевшего крушение в 1912 году. Не так давно во Франции было найдено послание, написанное от имени этой девочки:

письмо Матильды Лефевр с Титаника
Ознакомиться с источником новости можно сайте UQAR

В послании девочка сообщает, что через несколько дней она вместе со своей семьей прибудет в Нью-Йорк, и просит нашедшего послание, сообщить эту информацию семье Лефевров в Лёвен.

Пока ученые занимаются изучением материалов и выясняют, действительно ли записка была написана за день до крушения «Титаника», или же — сфабрикована современными шутниками, мы загрузим базу данных о пассажирах легендарного лайнера и отыщем информацию о Матильде и ее семье. Базу данных о пассажирах «Титаника» можно скачать здесь: titanic.сsv . Подробное описание данных, хранящихся в датасете, расположено на сайте Kaggle: https://www.kaggle.com/c/titanic/data

Что нужно сделать?

  1. Загрузить базу данных с пассажирами «Титаника»
  2. Последовательным перебором отыскать строки, содержащие фамилию «Lefebre» в колонке «Name»
  3. Вывести найденные строки на экран

Инструменты, которые могут пригодиться:

  • Библиотека Pandas для работы с датасетом
  • Цикл for для прохождения по всем записям в колонке «Name»
  • Функция find(). Если нам нужно в строке «main_string» отыскать фразу «искомая фраза», то вызов функции find() будет выглядеть следующим образом: main_string.find(«искомая фраза»). В результате работы функция find() вернет:
    • «-1», если «искомая фраза» не будет найдена в строке main_string
    • номер символа в строке main_string, с которого начинается «искомая фраза», если эта фраза будет найдена в строке main_string.

Предлагаю сразу взглянуть на работающий код с комментариями. Более подробный разбор основных моментов приведен ниже, под кодом.

Полный код с комментариями

# загрузим библиотеку Pandas
import pandas as pd

# Снимем ограничения на вывод данных в pandas-таблице
pd.set_option("display.max_colwidth", None)
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)

# загрузим датасет
data = pd.read_csv('titanic.csv')

# Выведем на экран первые 10 строк датасета
data.head(10)

# объявим переменную i, в которой будем хранить текущее значение идентификатора пассажира
i=0
# для каждой записи из колонки 'Name'
for name in data['Name']:
    # увеличиваем счетчик идентификатора
    i += 1
    # сохраняем в переменной res результат работы функции find()
    res = name.find('Lefebre')
    # если совпадения найдены, то выводим соответствующую строку на экран
    if(res>-1):
        print(data[data['PassengerId']==i])

Полученный результат:

Найденные строки с данными пассажиров по фамилии Lefebre
Найденные строки с данными пассажиров по фамилии Lefebre

Из полученного результата следует, что на борту «Титаника» находились 4 пассажира с фамилией Lefebre под идентификационными номерами: 176, 229, 409, 485. Имена пассажиров: Master. Henry Forbes, Miss. Mathilde, Miss. Ida, Miss. Jeannie. Данные о возрасте в датасете отсутствуют. Найденные пассажиры купили билеты 3-го класса, о чем говорит значение в столбце «Pclass» и отправились из города Саутгемптона, что следует из значения в столбце «Embarked». К сожалению, все пассажиры с фамилией Lefebre, потерпевшие крушение на «Титатике», погибли.

Пояснения к коду:

1. Загрузка датасета. В моем случае, файл «titanic.csv» хранится в той же директории, что и файл с кодом, поэтому путь к датасету будет совпадать с именем csv-файла — titanic.csv:

# загрузим библиотеку Pandas
import pandas as pd

# загрузим датасет
data = pd.read_csv('titanic.csv')

Для того, чтобы хранящаяся в датасете информация выводилась без сокращений при вызове функции data.head(), снимем ограничения на максимальное количество рядов и колонок, а также на максимально допустимый размер записи в ячейке:

# Снимем ограничения на количество символов в ячейке
pd.set_option("display.max_colwidth", None)
# Снимем ограничения на число столбцов
pd.set_option('display.max_columns', None)
# Снимем ограничения на максимальное количество рядов
pd.set_option('display.max_rows', None) 

2. Формирование цикла for для обхода по всем записям в колонке «Name». Так как мы планируем вывести все имеющееся в датасете досье на пассажиров с фамилией «Lefebre», то:

  • необходимо получить идентификационные номера пассажиров с искомой фамилией;
  • вывести на экран строки датасета, в которых содержимое ячеек из колонки «PassengerId» совпадает с найденными идентификационными номерами пассажиров.

Для начала объявим переменную, в которой будем хранить ИД — номера пассажиров. После этого создадим цикл for для прохождения по всем записям в колонке «Name».

# объявим переменную i, в которой будем хранить текущее значение идентификатора пассажира
i=0
# для каждой записи из колонки 'Name'
for name in data['Name']:

Так как id номера пассажиров в датасете уникальны и упорядочены по возрастанию, то предлагаю в каждой итерации увеличивать значение переменной i на единицу для получения идентификатора пассажира:

i=0
for name in data['Name']:
    # увеличиваем счетчик идентификатора
    i += 1

После этого для каждой записи name из колонки «Name» будем вызывать функцию find() для поиска в name вхождения ‘Lefebre’. Результат работы функции find() будем хранить в переменной res:

i=0
for name in data['Name']:
    # увеличиваем счетчик идентификатора
    i += 1
    # сохраняем в переменной res результат работы функции find()
    res = name.find('Lefebre')

В случае, если совпадение не будет найдено, функция find() вернет значение «-1». В противном случае будет возвращен позиционный номер символа, с которого начинается совпадение, то есть положительное целое число. Поэтому предлагаю с помощью цикла if выяснить, хранится ли в переменной res значение, отличное от «-1», и при res>-1 вывести строку с текущим идентификатором пассажира на экран:

i=0
for name in data['Name']:
    i += 1
    res = name.find('Lefebre')
    # если совпадения найдены, то выводим соответствующую строку на экран
    if(res>-1):
        print(data[data['PassengerId']==i])

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