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

    • PassengerId: 各乗客の ID。

    • Survived: 乗客が生存したかどうかを示す指標。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]
    

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 の属性であり(読み書きに関するチュートリアル を思い出してください。属性には括弧を使用しません)、行数と列数:(nrows, ncolumns) が含まれています。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 つのステートメントを |(または)演算子で結合するのと同じです。

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 行はまだ同じ値であるため、実際何が変わったのだろうと思うかもしれません。確認する方法の 1 つは、shape が変更されたかどうかを確認することです。

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 に基づいて選択したデータに新しい値を割り当てることができます。

ユーザーガイドへ

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