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]
DataFrame のサブセットを選択するにはどうすればよいですか?#
DataFrame から特定の列を選択するにはどうすればよいですか?#
タイタニックの乗客の年齢に関心があります。
In [4]: ages = titanic["Age"] In [5]: ages.head() Out[5]: 0 22.0 1 38.0 2 26.0 3 35.0 4 35.0 Name: Age, dtype: float64
単一の列を選択するには、関心のある列の列名を含む角括弧
[]を使用します。
DataFrame の各列は Series です。単一の列が選択されると、返されるオブジェクトはpandas Series です。出力の型を調べることで、これを確認できます。
In [6]: type(titanic["Age"])
Out[6]: pandas.core.series.Series
そして、出力の shape を見てみましょう。
In [7]: titanic["Age"].shape
Out[7]: (891,)
DataFrame.shape は、行と列の数を含むpandas Series および DataFrame の属性です(読み書きに関するチュートリアルを思い出してください。属性には括弧を使用しません):(行数、列数)。pandas Series は1次元であり、行数のみが返されます。
タイタニックの乗客の年齢と性別に関心があります。
In [8]: age_sex = titanic[["Age", "Sex"]] In [9]: age_sex.head() Out[9]: Age Sex 0 22.0 male 1 38.0 female 2 26.0 female 3 35.0 female 4 35.0 male
複数の列を選択するには、選択ブラケット
[]内で列名のリストを使用します。
注
内側の角括弧は列名を含む Pythonリスト を定義し、外側の括弧は前の例で見たようにpandas DataFrame からデータを選択するために使用されます。
返されるデータ型はpandas DataFrameです。
In [10]: type(titanic[["Age", "Sex"]])
Out[10]: pandas.core.frame.DataFrame
In [11]: titanic[["Age", "Sex"]].shape
Out[11]: (891, 2)
選択により、891行2列の DataFrame が返されました。 DataFrame は行と列の両方の次元を持つ2次元であることを思い出してください。
インデックス付けの基本情報については、データのインデックス付けと選択のユーザーガイドセクションを参照してください。
DataFrame から特定の行をフィルタリングするにはどうすればよいですか?#
35歳以上の乗客に関心があります。
In [12]: above_35 = titanic[titanic["Age"] > 35] In [13]: above_35.head() Out[13]: PassengerId Survived Pclass ... Fare Cabin Embarked 1 2 1 1 ... 71.2833 C85 C 6 7 0 1 ... 51.8625 E46 S 11 12 1 1 ... 26.5500 C103 S 13 14 0 3 ... 31.2750 NaN S 15 16 1 2 ... 16.0000 NaN S [5 rows x 12 columns]
条件式に基づいて行を選択するには、選択ブラケット
[]の内側に条件を使用します。
選択ブラケット titanic["Age"] > 35 内の条件は、Age 列の値が35より大きい行をチェックします。
In [14]: titanic["Age"] > 35
Out[14]:
0 False
1 True
2 False
3 False
4 False
...
886 False
887 False
888 False
889 False
890 False
Name: Age, Length: 891, dtype: bool
条件式 (>、ただし ==, !=, <, <= なども機能します) の出力は、実際には元の DataFrame と同じ行数を持つブール値 ( True または False のいずれか) の pandas Series です。このようなブール値の Series は、選択ブラケット [] の間に配置することで DataFrame をフィルタリングするために使用できます。値が True の行のみが選択されます。
元のタイタニックの DataFrame は891行で構成されていることは以前から分かっています。結果の DataFrame above_35 の shape 属性をチェックして、条件を満たす行の数を確認してみましょう。
In [15]: above_35.shape
Out[15]: (217, 12)
客室クラス2と3のタイタニック乗客に関心があります。
In [16]: class_23 = titanic[titanic["Pclass"].isin([2, 3])] In [17]: class_23.head() Out[17]: PassengerId Survived Pclass ... Fare Cabin Embarked 0 1 0 3 ... 7.2500 NaN S 2 3 1 3 ... 7.9250 NaN S 4 5 0 3 ... 8.0500 NaN S 5 6 0 3 ... 8.4583 NaN Q 7 8 0 3 ... 21.0750 NaN S [5 rows x 12 columns]
条件式と同様に、
isin()条件関数は、値が提供されたリストに含まれている各行に対してTrueを返します。このような関数に基づいて行をフィルタリングするには、選択ブラケット[]の内側で条件関数を使用します。この場合、選択ブラケットtitanic["Pclass"].isin([2, 3])内の条件は、Pclass列が2または3である行をチェックします。
上記は、クラスが2または3である行でフィルタリングし、2つのステートメントを | (OR) 演算子で結合することと同じです。
In [18]: class_23 = titanic[(titanic["Pclass"] == 2) | (titanic["Pclass"] == 3)]
In [19]: class_23.head()
Out[19]:
PassengerId Survived Pclass ... Fare Cabin Embarked
0 1 0 3 ... 7.2500 NaN S
2 3 1 3 ... 7.9250 NaN S
4 5 0 3 ... 8.0500 NaN S
5 6 0 3 ... 8.4583 NaN Q
7 8 0 3 ... 21.0750 NaN S
[5 rows x 12 columns]
注
複数の条件文を結合する場合、各条件は括弧 () で囲む必要があります。さらに、or/and は使用できず、or 演算子 | と and 演算子 & を使用する必要があります。
年齢が分かっている乗客データで作業したいです。
In [20]: age_no_na = titanic[titanic["Age"].notna()] In [21]: age_no_na.head() Out[21]: 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]
notna()条件関数は、値がNull値でない各行に対してTrueを返します。そのため、これを選択ブラケット[]と組み合わせてデータテーブルをフィルタリングできます。
最初の5行はまだ同じ値なので、実際に何が変わったのか疑問に思うかもしれません。確認する一つの方法は、形状が変更されたかどうかをチェックすることです。
In [22]: age_no_na.shape
Out[22]: (714, 12)
欠損値に関するより詳細な関数については、欠損データの処理に関するユーザーガイドのセクションを参照してください。
DataFrame から特定の行と列を選択するにはどうすればよいですか?#
35歳以上の乗客の名前に関心があります。
In [23]: adult_names = titanic.loc[titanic["Age"] > 35, "Name"] In [24]: adult_names.head() Out[24]: 1 Cumings, Mrs. John Bradley (Florence Briggs Th... 6 McCarthy, Mr. Timothy J 11 Bonnell, Miss. Elizabeth 13 Andersson, Mr. Anders Johan 15 Hewlett, Mrs. (Mary D Kingcome) Name: Name, dtype: object
この場合、行と列の両方のサブセットを一度に作成し、単に選択ブラケット
[]を使用するだけでは不十分です。選択ブラケット[]の前にloc/iloc演算子が必要です。loc/ilocを使用する場合、コンマの前の部分は選択したい行、コンマの後の部分は選択したい列です。
列名、行ラベル、または条件式を使用する場合は、選択ブラケット [] の前に loc 演算子を使用します。コンマの前後の両方で、単一のラベル、ラベルのリスト、ラベルのスライス、条件式、またはコロンを使用できます。コロンを使用すると、すべての行または列を選択することを指定します。
10行目から25行目、3列目から5列目に関心があります。
In [25]: titanic.iloc[9:25, 2:5] Out[25]: Pclass Name Sex 9 2 Nasser, Mrs. Nicholas (Adele Achem) female 10 3 Sandstrom, Miss. Marguerite Rut female 11 1 Bonnell, Miss. Elizabeth female 12 3 Saundercock, Mr. William Henry male 13 3 Andersson, Mr. Anders Johan male .. ... ... ... 20 2 Fynney, Mr. Joseph J male 21 2 Beesley, Mr. Lawrence male 22 3 McGowan, Miss. Anna "Annie" female 23 1 Sloper, Mr. William Thompson male 24 3 Palsson, Miss. Torborg Danira female [16 rows x 3 columns]
繰り返しになりますが、行と列の両方のサブセットを一度に作成し、単に選択ブラケット
[]を使用するだけでは不十分です。テーブル内の位置に基づいて特定の行や列に特に関心がある場合は、選択ブラケット[]の前にiloc演算子を使用します。
loc または iloc を使用して特定の行や列を選択する場合、選択したデータに新しい値を割り当てることができます。例えば、4番目の列の最初の3つの要素に anonymous という名前を割り当てるには、次のようになります。
In [26]: titanic.iloc[0:3, 3] = "anonymous"
In [27]: titanic.head()
Out[27]:
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]
loc および iloc の使用方法についてより深く理解するには、ユーザーガイドの インデックス付けの異なる選択肢 のセクションを参照してください。
覚えておいてください
データのサブセットを選択する際は、角括弧
[]を使用します。これらのブラケット内では、単一の列/行ラベル、列/行ラベルのリスト、ラベルのスライス、条件式、またはコロンを使用できます。
行名と列名を使用する場合は、
locを使用して特定の行および/または列を選択します。テーブル内の位置を使用する場合は、
ilocを使用して特定の行および/または列を選択します。loc/ilocに基づく選択に新しい値を割り当てることができます。
インデックス作成の全般的な概要は、ユーザーガイドのデータのインデックス作成と選択のページで提供されています。