In [1]: import pandas as pd
このチュートリアルで使用するデータ
  • このチュートリアルでは、CSV として保存されているタイタニック号のデータセットを使用します。データは次のデータ列で構成されています。

    • PassengerId: 各乗客のID。

    • Survived: 乗客が生存したかどうかを示す。生存した場合は 0、生存しなかった場合は 1

    • Pclass: 3つのチケットクラスのうちの1つ: Class 1、Class 2、Class 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つの要素のリストとして返されます。最初の要素はコンマより前の部分で、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]
    

    彼女の物語に興味がありますか? Wikipediaをご覧ください!

    文字列メソッドSeries.str.contains()は、Name列の各値に文字列Countessが含まれているかどうかをチェックし、各値に対してTrueCountessが名前の一部である)またはFalseCountessが名前の一部ではない)を返します。この出力は、データのサブセット化チュートリアルで紹介された条件付き(ブール)インデックスを使用してデータをサブセレクトするために使用できます。タイタニック号には伯爵夫人が一人しかいなかったため、結果として1行が得られます。

より強力な文字列の抽出がサポートされており、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()は文字列メソッドではありませんが、特定の値を変換するためにマッピングや語彙を使用する便利な方法を提供します。マッピング{from : to}を定義するためのdictionaryが必要です。

警告

特定の文字セットを置換するためにreplace()メソッドも利用できます。ただし、複数の値のマッピングがある場合、これは次のようになります。

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

これは煩雑になり、間違いを簡単に引き起こす可能性があります。これら2つのステートメントが逆の順序で適用された場合どうなるか考えてみてください(または自分で試してみてください)。

覚えておいてください

  • 文字列メソッドはstrアクセサーを使用して利用できます。

  • 文字列メソッドは要素ごとに機能し、条件付きインデックス作成に使用できます。

  • replaceメソッドは、与えられた辞書に従って値を変換する便利なメソッドです。

ユーザーガイドへ

完全な概要は、ユーザーガイドのテキストデータの操作のページで提供されています。