In [1]: import pandas as pd
Данные, используемые в этом руководстве:
  • Этот учебник использует набор данных Titanic, сохраненный как CSV. Данные состоят из следующих столбцов данных:

    • PassengerId: Идентификатор каждого пассажира.

    • Выжил: Указание, выжил ли пассажир. 0 для да и 1 для нет.

    • Pclass: Один из 3 классов билетов: Класс 1, Класс 2 и Класс 3.

    • Name: Имя пассажира.

    • Sex: Пол пассажира.

    • Age: Возраст пассажира в годах.

    • SibSp: Количество братьев, сестер или супругов на борту.

    • Parch: Количество родителей или детей на борту.

    • Ticket: Номер билета пассажира.

    • Fare: Указывает стоимость проезда.

    • Cabin: Номер каюты пассажира.

    • Embarked: Порт посадки.

    К исходным данным
    In [2]: titanic = pd.read_csv("data/titanic.csv")
    
    In [3]: titanic.head()
    Out[3]: 
       PassengerId  Survived  Pclass  ...     Fare Cabin  Embarked
    0            1         0       3  ...   7.2500   NaN         S
    1            2         1       1  ...  71.2833   C85         C
    2            3         1       3  ...   7.9250   NaN         S
    3            4         1       1  ...  53.1000  C123         S
    4            5         0       3  ...   8.0500   NaN         S
    
    [5 rows x 12 columns]
    

Как работать с текстовыми данными#

  • Сделать все символы имени строчными.

    In [4]: titanic["Name"].str.lower()
    Out[4]: 
    0                                braund, mr. owen harris
    1      cumings, mrs. john bradley (florence briggs th...
    2                                 heikkinen, miss. laina
    3           futrelle, mrs. jacques heath (lily may peel)
    4                               allen, mr. william henry
                                 ...                        
    886                                montvila, rev. juozas
    887                         graham, miss. margaret edith
    888             johnston, miss. catherine helen "carrie"
    889                                behr, mr. karl howell
    890                                  dooley, mr. patrick
    Name: Name, Length: 891, dtype: object
    

    Чтобы сделать каждую из строк в Name столбец в нижнем регистре, выберите Name столбца (см. руководство по выбору данных), добавьте str аксессор и применить lower метод. Таким образом, каждая из строк преобразуется поэлементно.

Аналогично объектам datetime в руководство по временным рядам имеющий dt аксессор, ряд специализированных строковых методов доступен при использовании str аксессор. Эти методы, как правило, имеют совпадающие названия с эквивалентными встроенными строковыми методами для отдельных элементов, но применяются поэлементно (помните поэлементные вычисления?) на каждом из значений столбцов.

  • Создать новый столбец Surname которая содержит фамилии пассажиров, извлекая часть перед запятой.

    In [5]: titanic["Name"].str.split(",")
    Out[5]: 
    0                             [Braund,  Mr. Owen Harris]
    1      [Cumings,  Mrs. John Bradley (Florence Briggs ...
    2                              [Heikkinen,  Miss. Laina]
    3        [Futrelle,  Mrs. Jacques Heath (Lily May Peel)]
    4                            [Allen,  Mr. William Henry]
                                 ...                        
    886                             [Montvila,  Rev. Juozas]
    887                      [Graham,  Miss. Margaret Edith]
    888          [Johnston,  Miss. Catherine Helen "Carrie"]
    889                             [Behr,  Mr. Karl Howell]
    890                               [Dooley,  Mr. Patrick]
    Name: Name, Length: 891, dtype: object
    

    Используя Series.str.split() метод, каждое из значений возвращается как список из 2 элементов. Первый элемент — это часть до запятой, а второй элемент — часть после запятой.

    In [6]: titanic["Surname"] = titanic["Name"].str.split(",").str.get(0)
    
    In [7]: titanic["Surname"]
    Out[7]: 
    0         Braund
    1        Cumings
    2      Heikkinen
    3       Futrelle
    4          Allen
             ...    
    886     Montvila
    887       Graham
    888     Johnston
    889         Behr
    890       Dooley
    Name: Surname, Length: 891, dtype: object
    

    Поскольку нас интересует только первая часть, представляющая фамилию (элемент 0), мы снова можем использовать str аксессор и применить Series.str.get() для извлечения соответствующей части. Действительно, эти строковые функции можно объединять для комбинирования нескольких функций одновременно!

К руководству пользователя

Дополнительная информация об извлечении частей строк доступна в разделе руководства пользователя разделение и замена строк.

  • Извлеките данные о пассажирах-графинях на борту Титаника.

    In [8]: titanic["Name"].str.contains("Countess")
    Out[8]: 
    0      False
    1      False
    2      False
    3      False
    4      False
           ...  
    886    False
    887    False
    888    False
    889    False
    890    False
    Name: Name, Length: 891, dtype: bool
    
    In [9]: titanic[titanic["Name"].str.contains("Countess")]
    Out[9]: 
         PassengerId  Survived  Pclass  ... Cabin Embarked  Surname
    759          760         1       1  ...   B77        S   Rothes
    
    [1 rows x 13 columns]
    

    (Интересна её история? Смотрите Википедия!)

    Строковый метод Series.str.contains() проверяет каждое из значений в столбце Name если строка содержит слово Countess и возвращает для каждого из значений True (Countess является частью имени) или False (Countess не является частью имени). Этот вывод можно использовать для выбора подмножества данных с помощью условного (булевого) индексирования, представленного в руководство по выборке данных. Поскольку на Титанике была только одна графиня, мы получаем одну строку в результате.

Примечание

Поддерживаются более мощные извлечения из строк, так как Series.str.contains() и Series.str.extract() методы принимают регулярные выражения, но выходит за рамки данного руководства.

К руководству пользователя

Дополнительная информация об извлечении частей строк доступна в разделе руководства пользователя сопоставление и извлечение строк.

  • У какого пассажира Титаника самое длинное имя?

    In [10]: titanic["Name"].str.len()
    Out[10]: 
    0      23
    1      51
    2      22
    3      44
    4      24
           ..
    886    21
    887    28
    888    40
    889    21
    890    19
    Name: Name, Length: 891, dtype: int64
    

    Чтобы получить самое длинное имя, сначала нужно получить длины каждого из имен в Name столбец. Используя строковые методы pandas, Series.str.len() функция применяется к каждому из имен индивидуально (поэлементно).

    In [11]: titanic["Name"].str.len().idxmax()
    Out[11]: 307
    

    Далее нам нужно получить соответствующую позицию, предпочтительно метку индекса, в таблице, для которой длина имени наибольшая. Функция idxmax() метод делает именно это. Это не строковый метод и применяется к целым числам, поэтому нет str используется.

    In [12]: titanic.loc[titanic["Name"].str.len().idxmax(), "Name"]
    Out[12]: 'Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo)'
    

    На основе имени индекса строки (307) и столбец (Name), мы можем выполнить выборку с помощью loc оператор, представленный в учебное пособие по выборке подмножеств.

  • В столбце "Sex" замените значения "male" на "M", а значения "female" на "F".

    In [13]: titanic["Sex_short"] = titanic["Sex"].replace({"male": "M", "female": "F"})
    
    In [14]: titanic["Sex_short"]
    Out[14]: 
    0      M
    1      F
    2      F
    3      F
    4      M
          ..
    886    M
    887    F
    888    F
    889    M
    890    M
    Name: Sex_short, Length: 891, dtype: object
    

    В то время как replace() не является строковым методом, он предоставляет удобный способ использования отображений или словарей для преобразования определенных значений. Требуется dictionary для определения соответствия {from : to}.

Предупреждение

Также есть replace() метод доступен для замены определенного набора символов. Однако при наличии отображения нескольких значений это становится:

titanic["Sex_short"] = titanic["Sex"].str.replace("female", "F")
titanic["Sex_short"] = titanic["Sex_short"].str.replace("male", "M")

Это стало бы громоздким и легко привело бы к ошибкам. Просто подумайте (или попробуйте сами), что произойдет, если эти два оператора применить в обратном порядке…

ПОМНИТЕ

  • Строковые методы доступны с использованием str аксессор.

  • Строковые методы работают поэлементно и могут использоваться для условного индексирования.

  • The replace метод является удобным методом для преобразования значений в соответствии с заданным словарём.

К руководству пользователя

Полный обзор предоставлен на страницах руководства пользователя по работа с текстовыми данными.