YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

pandas DataFrameの行・列を抽出|loc, iloc, at, iatわかりやすく解説!

pandasDataFrameを使うと、行と列で構成されたデータを簡単に取り扱うことができます。

しかし、pandasに慣れないうちは、DataFrameの簡単な操作でつまずいてしまうことも…

例えば…:

  • DataFrameの特定の行、列のデータを抽出するにはどうしたらいいの?
  • df[ ]とかdf.loc[ ]とかdf.iloc[ ]とかいっぱいありすぎ!意味不明!

そこで、この記事では次の内容をわかりやすい図解付きで解説していきます:

  • DataFrameの特定の行、列のデータを抽出する方法
  • インデックス参照[ ].loc[ ].iloc[ ]at[ ]iat[ ]の使い分け
  • ラベル名と行・列番号が混在したときのデータ抽出方法

DataFrameの行・列の抽出は、pandasを自由に操作するための第一歩です!

サクッと覚えて、pandasマスターを目指しましょう!

 

DataFrameの基本構造

特定の行や列、値を抽出する場合には、DataFrameの次の要素を指定します。

  • インデックス名、カラム名(2つあわせてラベル名と呼ぶことにします)
  • 行番号、列番号

まずは、DataFrameのどこが何に相当するのか整理しましょう。

インデックスとカラムは、それぞれ行・列を特定するラベルです。

例えば、下図のようにインデックス名やカラム名を指定すれば、どの行、列を指定したのかがわかりますね。

インデックス名とカラム名を使えばデータの抽出ができそうですね(⇒インデックス参照df[ ], .loc[ ], .at[ ]で可能)。

また、各行や列は、ラベル名とは別に0から始まる行番号、列番号を持っています。

行番号、列番号を使ってもデータの抽出ができそうですね(⇒.iloc[ ], .iat[ ]で可能)。

インデックス、カラム、行番号、列番号がDataFrameのどこに対応するかわかりました。

以下では、実際にこれらを使用してDataFrameのデータを抽出する方法を紹介します。

DataFrameの行、列、値を抽出する基本的な方法

以下では、DataFrameの行、列、特定の値を抽出する方法を次の順番で紹介します。

  1. インデックス参照で行、列抽出|df[ ]
  2. インデックス名、カラム名で行、列抽出|df.loc[ ]
  3. 行番号、列番号で行、列抽出|df.iloc[ ]
  4. 特定の値を抽出|at[ ], iat[ ]

実際には、df.loc[ ]df.iloc[ ]だけで、ほとんどの状況に対応できます。

しかし、それぞれの方法にメリットがあるので、他の手法もぜひチェックしてください!

以下では、次のDataFrameを例に各方法を紹介していきます。

data = {"Data0":[0,1,2],
             "Data1":[10, 11, 12],
             "Data2":[20, 21, 22], }
 
df = pd.DataFrame(data, index = pd.Index(["Ind0", "Ind1", "Ind2"], name="Ind"))

インデックス参照で行、列抽出|df[ ]

pythonのリストや辞書型にアクセスするのと同じような方法です。

DataFrameの後ろに[ ]を付けて行、列を抽出します。

[ ]へのラベルの与え方によって、次の3つの使い方があります。

ラベル名の与え方 抽出結果
df[カラム名] 列のSeries
df[ [カラム名のリスト] ] 列のDataFrame
df[ :インデックス名のスライス ] 行のDataFrame

図解すると下図のようになります。

①:列のSeriesdf[カラム名]

df[カラム名]で、dfの列をSeriesとして抽出できます。

df["Data0"]
 
# Ind
# Ind0    0
# Ind1    1
# Ind2    2
# Name: Data0, dtype: int64

"Data0"行がSeriesとして抽出されましたね。

このように列の抽出の場合には、インデックス参照が手軽で便利です。

②:列のDataFramedf[ [カラム名のリスト] ]

複数列のDataFrameを抽出したい場合には、df[ [カラム名のリスト] ]で抽出します。

df[["Data1", "Data2"]]

[カラム名のリスト]は、1要素でもOKです。

df[ ["Data0"] ]

③:行のDataFramedf[ :インデックス名のスライス ]

インデックス名のスライスを渡すと、スライス範囲の行がDataFrameとして抽出されます。

df["Ind1":"Ind2"]

このとき注意ですが、カラム名ではスライスはできません。

正直言うと、インデックス名、カラム名どちらで参照しているのかわかりにくいので、③はおススメできません。

インデックス名を指定する場合は、次に紹介するdf.loc[ ]の方がおススメです。

インデックス名、カラム名で行、列抽出|df.loc[ ]

df.loc[ ]を使用すると、インデック名、カラム名でデータを抽出することができます。

抽出範囲は、インデックス、カラムの順に指定します。

  • df.loc[インデックス指定, カラム指定]

インデックス、ラベルの指定方法には主に次の3つを使用します。

  • 単独のラベル名
  • [ラベル名のリスト]
  • :ラベル名のスライス

これらを組み合わせて、特定の位置のデータや選択範囲の行・列を抽出することができます。

行と列の指定方法と出力形式の関係を整理すると次の表のようになります。

df.loc[インデックス指定, カラム指定] カラム名(単体) [カラム名のリスト]
or
カラム名のスライス
インデックス名(単体) ①特定の位置のデータ ②特定の列のSeries
[インデックス名のリスト]
or
インデックス名のスライス
②特定の行のSeries ③選択範囲のDataFrame

以下では、次の順番で抽出方法を解説していきます。

  1. 特定の位置のデータ
  2. 特定の行または列のSeries
  3. 選択範囲のDataFrame

特定の位置のデータを抽出

インデックス名、カラム名両方を指定すると特定の位置のデータが指定されます。

  • df.loc[インデックス名, カラム名]

特定の位置のデータにアクセスする例を紹介します。

df.loc["Ind1", "Data2"]
# 21

値を代入することで、書き込みも可能です。

df.loc["Ind1", "Data2"] = 999
 
#       Data0  Data1  Data2
# Ind                      
# Ind0      0     10     20
# Ind1      1     11    999  ←値が書き換えられた。
# Ind2      2     12     2

特定の値にアクセス場合には、後述するdf.at[ ]でも可能です。

df.at[ ]の方が速いので、特定の値にアクセスするだけなら、df.at[ ]の方が良さそうです。

df.loc[ ]は、以下で説明するように行や列の抽出時に真価を発揮します。

特定の行または列を抽出

特定の一行または列を指定する場合には、ラベル名指定とスライスを組み合わせます。

  • 特定の行を指定|df.loc[インデックス名, : ] または df.loc[インデックス名]
  • 特定の列を指定|df.loc[:, カラム名]

下図のように対応した行、列がSeriesとして抽出されます。

サンプルコードをみて見ましょう。

# 行の抽出例
df.loc["Ind0", :]  # またはdf.loc["Ind0"]
 
# ↓出力:Ind0行のシリーズ
# Data0     0
# Data1    10
# Data2    20
# Name: Ind0, dtype: int64
 
# 列の抽出例
df.loc[:,"Data0"]
 
# ↓出力:Data0列のシリーズ
# Ind
# Ind0    0
# Ind1    1
# Ind2    2
# Name: Data0, dtype: int64

一行または一列をDataFrameで出力したい場合には、要素が一つのリストとしてラベル名を渡します。

  • 特定の行を指定|df.loc[[インデックス名], : ] または df.loc[[インデックス名]]
  • 特定の列を指定|df.loc[:, [カラム名]]

例として行を抽出してみましょう。

df.loc[["Ind0"], :]

これは次に紹介する複数行・列で、要素が一つのリストを渡したと考えると覚えやすいです。

複数の行または列を抽出

複数の行または列を指定する場合には、ラベル名を次のように指定します。

  • [ラベル名のリスト]
  • :ラベル名のスライス

行、列の一方を : にすれば、特定の行、列の抽出が可能です。

例えば、[ラベル名のリスト]で指定する場合には、次のように指定します。

  • 複数の行を抽出|df.loc[[インデックス名のリスト], :]
    または df.loc[[インデックス名のリスト]]
  • 複数の列を抽出|df.loc[:, [カラム名のリスト]]

スライスの場合もまとめると下図のようになります。

実際に行、列を抽出するサンプルコードを見てみましょう。

df.loc[["Ind0", "Ind1"], :]

次に列の抽出例を見てみましょう。

df.loc[:, ["Data0", "Data2"]]

とても簡単ですね。

もちろん、下図のように行および列を同時に指定して、DataFrameの一部を抽出することも可能です。

このとき、行または列の一方がラベル名だとシリーズとして抽出されます。

df.loc[["Ind0", "Ind1"], "Data0"]
 
# Ind
# Ind0    0
# Ind1    1
# Name: Data0, dtype: int64

行と列両方をリストで指定していると、DataFrameとして抽出されます。

df.loc[["Ind0", "Ind1"], ["Data0", "Data1"]]

行番号、列番号で行、列抽出|df.iloc[ ]

df.iloc[ ]を使用すると、行番号や列番号で行や列の抽出を行うことができます。

DataFrameの行、列には0から始まる行番号、列番が割り当てられています。

抽出範囲は、行番号、列番号の順に指定します。

  • df.loc[行番号指定, 列番号指定]

行番号、列番号の指定方法には主に次の3つを使用します。

  • 単独の行番号列番号
  • :行番号・列番号のスライス
  • [行番号・列番号のリスト]

これらを組み合わせて、特定の位置のデータや選択範囲の行・列を抽出することができます。

行と列の指定方法と出力形式の関係を整理すると次の表のようになります。

df.loc[行番号指定, 列番号指定] 列番号(単体) [列番号のリスト]
or
列番号のスライス
行番号(単体) ①特定の位置のデータ ②特定の列のSeries
[行番号のリスト]
or
行番号のスライス
②特定の行のSeries ③選択範囲のDataFrame

以下では、次の順番で抽出方法を解説していきます。

  1. 特定の位置のデータ
  2. 特定の行または列のSeries
  3. 選択範囲のDataFrame

特定の位置のデータを抽出

行番号、列番号両方を指定すると特定の位置のデータが指定されます。

  • df.loc[行番号, 列番号]

特定の位置のデータにアクセスする例を紹介します。

df.iloc[1,2] 
# 21

特定の値にアクセス場合には、後述するdf.iat[ ]の方が速いです。

特定の行または列を抽出

特定の一行または列を指定する場合には、ラベル名指定とスライスを組み合わせます。

  • 特定の行を指定|df.iloc[行番号, : ] または df.iloc[行番号]
  • 特定の列を指定|df.iloc[:, 列番号]

下図のように対応した行、列がSeriesとして抽出されます。

サンプルコードをみて見ましょう。

# 行の抽出例
df.iloc[0, :]  # またはdf.iloc[0]
 
# ↓出力:Ind0行のシリーズ
# Data0     0
# Data1    10
# Data2    20
# Name: Ind0, dtype: int64
 
# 列の抽出例
df.iloc[:,0]
 
# ↓出力:Data0列のシリーズ
# Ind
# Ind0    0
# Ind1    1
# Ind2    2
# Name: Data0, dtype: int64

一行または一列のDataFrameで出力したい場合には、要素が一つのリストでラベル名を渡します。

df.iloc[[0], :]

複数の行または列を抽出

複数の行または列を指定する場合には、ラベル名を次のように指定します。

  • : 行・列番号のスライス
  • [行・列番号のリスト]

行、列の一方を : にすれば、特定の行、列の抽出が可能です。

例えば、行・列番号のスライスで指定する場合には、次のように指定します。

  • 複数の行を抽出|df.iloc[行番号のスライス, :] または df.iloc[行番号のスライス]
  • 複数の列を抽出|df.iloc[:, 列番号のスライス]

[行・列番号のリスト]の場合もまとめると下図のようになります。

実際に行、列を抽出するサンプルコードを見てみましょう。

df.iloc[:2, :]

次に列の抽出例を見てみましょう。

df.iloc[:, 1:]

行と列両方を指定すると例を見てみましょう。

df.iloc[:2, 1:]

特定の値を抽出|at[ ], iat[ ]

df.at[ ]df.iat[ ]を使用するとDataFrameの特定の位置のデータにアクセスすることができます。

  • df.at[インデックス名, カラム名]
  • df.iat[行番号, 列番号]

df.loc[ ], df.iloc[ ]と違って、範囲指定ができない分df.at[ ], df.iat[ ]の方が速いです。

サンプルコードを紹介します。

df.at["Ind0", "Data1"]
# 10
 
df.iat[0, 2]
# 20

【トラブル事例】ラベル名と行・列番号が混在するときの対処

ここでは、DataFramedf.index属性とdf.columns属性を使用した対処方法を紹介します。

行・列番号とインデックス名、カラム名が混在している場合には次のように指定します。

  • df.loc[ df.index[行番号指定], カラムの指定 ]
  • df.loc[インデックスの指定, df.columns[列番号指定] ]

行番号カラム名でデータを抽出する例をみてみましょう。

df.loc[df.index[1:], ["Data0", "Data2"]]

逆に列番号インデックス名でデータを抽出する例をみてみましょう。

df.loc[["Ind0", "Ind1"], df.columns[:2]]

df.indexとdf.columnsの操作ができると、こういったDataFrameの細かい操作ができるようになってきます。

次の記事で詳しく解説しているので是非チェックしてみてください。

≫pandas インデックス名の設定・変更|パターン別にわかりやすく解説
≫pandas インデックス名の設定・変更|パターン別にわかりやすく解説
pandasのDataFrameでは、インデックス名やカラム名を使ってデータにアクセスしますね。しかし、インデックスやコラムの操作は少しわかりにくい部分も…。そこで、この記事では①インデックスの基本的な設定方法、変更方法、②インデックス番号のリセット方法をサンプルコード付きでわかりやすく解説!
www.yutaka-note.com/entry/pandas_index_setting
 
≫pandas インデックスの基本操作|要素にアクセス、
≫pandas インデックスの基本操作|要素にアクセス、
pandasのDataFrameでは、インデックス名やカラム名を使ってデータにアクセスしますね。しかし、インデックスやコラムの操作は少しわかりにくい部分も…。そこで、この記事では①インデックスの基本構造②インデックス内要素へのアクセス方法③基本的なインデックス操作(データ探索、並べ替え、重複処理、欠損値処理)をサンプルコード付きでわかりやすく解説!
www.yutaka-note.com/entry/pandas_index_manip
 

おわりに|padans関連おススメ追加コンテンツ

今回はpandasのインデックスの設定、変更に関する内容を紹介しました。

pandasは便利すぎて操作方法がわかりにくいことがよくあります…。

結局はコツコツ学ぶのが、pandasマスターの近道ですよね!≫【ブログカテゴリー:pandas】

≫【レビュー】「Pythonによるデータ分析入門」| pandas開発者によるpandasユーザーのためのpandasの教科書!
≫【レビュー】「Pythonによるデータ分析入門」| pandas開発者によるpandasユーザーのためのpandasの教科書!
「Pythonによるデータ分析入門」を、最初から最後まで実際に実践してみたレビューです。具体的にどのようなことができるようになったかを実例付きで紹介します!・DataFrameの生成方法・欠損値の処理方法・グラフ化の方法気になる学習時間は…?
www.yutaka-note.com/entry/2019/12/07/230219
 
≫pandas リストからDataFrameを生成|インデックスとコラムの設定も!
≫pandas リストからDataFrameを生成|インデックスとコラムの設定も!
pandasでは、リストからデータフレームを生成することもできます。しかし、pandasの操作に慣れていないうちは、ちょっとした操作も難しいですよね。この記事では、①リストからデータフレームを生成、行と列を追加する方法、②インデックス名、コラム名を設定する方法、③DataFrameを転値する方法(行と列が期待と逆だった時の対応)をサンプルコード付きで紹介!
www.yutaka-note.com/entry/pandas_list
 
≫pandas 辞書型からDataFrameを生成|インデックスとコラムの設定も!
≫pandas 辞書型からDataFrameを生成|インデックスとコラムの設定も!
pandasでは、辞書型からデータフレームを生成することもできます。しかし、pandasの操作に慣れていないうちは、ちょっとした操作も難しいですよね。この記事では、①辞書型からデータフレームを生成する方法、②辞書のキーをインデックス名、コラム名それぞれに設定する方法、③DataFrame()とDataFrame.from_dict()の違いをサンプルコード付きで紹介!
www.yutaka-note.com/entry/pandas_dict
 
≫pandas インデックス名の設定・変更|パターン別にわかりやすく解説
≫pandas インデックス名の設定・変更|パターン別にわかりやすく解説
pandasのDataFrameでは、インデックス名やカラム名を使ってデータにアクセスしますね。しかし、インデックスやコラムの操作は少しわかりにくい部分も…。そこで、この記事では①インデックスの基本的な設定方法、変更方法、②インデックス番号のリセット方法をサンプルコード付きでわかりやすく解説!
www.yutaka-note.com/entry/pandas_index_setting
 
≫pandas インデックスの基本操作|要素にアクセス、
≫pandas インデックスの基本操作|要素にアクセス、
pandasのDataFrameでは、インデックス名やカラム名を使ってデータにアクセスしますね。しかし、インデックスやコラムの操作は少しわかりにくい部分も…。そこで、この記事では①インデックスの基本構造②インデックス内要素へのアクセス方法③基本的なインデックス操作(データ探索、並べ替え、重複処理、欠損値処理)をサンプルコード付きでわかりやすく解説!
www.yutaka-note.com/entry/pandas_index_manip
 
≫pandas | read_excel() 図解でわかりやすく解説!
≫pandas | read_excel() 図解でわかりやすく解説!
pandasで、excelファイルを読み込むための関数read_excel()について、図解で徹底解説!①表のデータがセルA1から始まっていないときの対応方法②indexやlabelの行や列を指定する方法
www.yutaka-note.com/entry/pandas_read_excel_1
 
≫pandas | read_csv() 図解でわかりやすく解説!
≫pandas | read_csv() 図解でわかりやすく解説!
pandasでcsvファイルを読み込むための関数read_csv()について、図解で徹底解説! ①区切り文字の指定②indexやlabelの行や列を指定する方法③読み込む行・列の指定など細かい設定についての解説記事です!
www.yutaka-note.com/entry/pandas_read_csv
 
≫【レビュー】「Python実践データ分析100本ノック」|100本終えたらpandasが好きになっていた
≫【レビュー】「Python実践データ分析100本ノック」|100本終えたらpandasが好きになっていた
Python実践データ分析100本ノックで、実際に100本終了したレビューです。pythonでのデータ分析の入門書としてかなりの良書だったと思います。・python2~3冊目に何を勉強しようか迷っている人・時間をかけずにデータ分析の基本を学びたい人・pandasへの抵抗を減らしたい人
www.yutaka-note.com/entry/nock_100
 
≫pandas|head(), tail()でデータ先頭, 末尾を抽出!
≫pandas|head(), tail()でデータ先頭, 末尾を抽出!
pandasのDataFrameやSeriesで先頭や末尾の数行をさっと確認したい場合には、head()、tail()メソッドを使用します。引数で表示する行数を指定することもできますので、その使用方法を解説していきます。
www.yutaka-note.com/entry/pandas_head_tail
 

Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。

気楽にツイートしているので、気軽にフォローしてください!