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

В послании девочка сообщает, что через несколько дней она вместе со своей семьей прибудет в Нью-Йорк, и просит нашедшего послание, сообщить эту информацию семье Лефевров в Лёвен.
Пока ученые занимаются изучением материалов и выясняют, действительно ли записка была написана за день до крушения «Титаника», или же — сфабрикована современными шутниками, мы загрузим базу данных о пассажирах легендарного лайнера и отыщем информацию о Матильде и ее семье. Базу данных о пассажирах «Титаника» можно скачать здесь: titanic.сsv . Подробное описание данных, хранящихся в датасете, расположено на сайте Kaggle: https://www.kaggle.com/c/titanic/data
Что нужно сделать?
- Загрузить базу данных с пассажирами «Титаника»
- Последовательным перебором отыскать строки, содержащие фамилию «Lefebre» в колонке «Name»
- Вывести найденные строки на экран
Инструменты, которые могут пригодиться:
- Библиотека 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])
Полученный результат:

Из полученного результата следует, что на борту «Титаника» находились 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])