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]
    

DataFrame のサブセットを選択するにはどうすればよいですか?#

DataFrame から特定の列を選択するにはどうすればよいですか?#

../../_images/03_subset_columns.svg
  • タイタニックの乗客の年齢に関心があります。

    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 から特定の行をフィルタリングするにはどうすればよいですか?#

../../_images/03_subset_rows.svg
  • 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_35shape 属性をチェックして、条件を満たす行の数を確認してみましょう。

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 演算子 & を使用する必要があります。

ユーザーガイドへ

ブールインデックス または isin関数 についてのユーザーガイドの専用セクションを参照してください。

  • 年齢が分かっている乗客データで作業したいです。

    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 から特定の行と列を選択するにはどうすればよいですか?#

../../_images/03_subset_columns_rows.svg
  • 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 に基づく選択に新しい値を割り当てることができます。

ユーザーガイドへ

インデックス作成の全般的な概要は、ユーザーガイドのデータのインデックス作成と選択のページで提供されています。