In [1]: import pandas as pd
- タイタニック号のデータ
このチュートリアルでは、CSV として保存されているタイタニック号のデータセットを使用します。データは次のデータ列で構成されています。
PassengerId: 各乗客のID。
Survived: 乗客が生存したかどうかを示す。生存した場合は
0、生存しなかった場合は1。Pclass: 3つのチケットクラスのうちの1つ: Class
1、Class2、Class3。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が含まれているかどうかをチェックし、各値に対してTrue(Countessが名前の一部である)またはFalse(Countessが名前の一部ではない)を返します。この出力は、データのサブセット化チュートリアルで紹介された条件付き(ブール)インデックスを使用してデータをサブセレクトするために使用できます。タイタニック号には伯爵夫人が一人しかいなかったため、結果として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メソッドは、与えられた辞書に従って値を変換する便利なメソッドです。
完全な概要は、ユーザーガイドのテキストデータの操作のページで提供されています。