改訂版 Pythonユーザのための Jupyter[実践]入門 [ 池内 孝啓、片柳 薫子、@driller ]
こんにちは、monachan_papa です。
今回は pandas.DataFrame の loc、ilocメソッドについて解説します。
loc、ilocメソッドは任意の行と列だけを簡単に抽出することができるメソッドです。ユーザはただ欲しい行と列を指定するだけでOKです。
しかし、これらのメソッドは行と列の指定方法が大きく異なり、指定方法もそれぞれ色々なやり方があります。
よって、簡単とは言いつつも使い慣れていなかったり、理解があやふやだと「アレ、どういう風にするんだっけ?」とスムーズな操作ができません。
本解説を読むことで、こういった点が整理 & 理解でき、スムーズなデータ抽出ができるようになります。
locメソッド
locメソッドは行、列に対してそれぞれ以下の情報を指定すると、データ抽出ができるメソッドです。
行情報
インデックスを以下のいずれかの方法で指定します。
- リストで指定
- スライスを使って範囲指定
列情報
列名を以下のいずれかの方法で指定します。
- リストで指定
- スライスを使って範囲指定
ilocメソッド
ilocメソッドは行、列に対してそれぞれ以下の情報を指定すると、データ抽出ができるメソッドです。
行情報
位置を表す行番号(開始位置は 0始まり)を以下のいずれかの方法で指定します。
- リストで指定
- スライスを使って範囲指定
列情報
位置を表す列番号(開始位置は 0始まり)を以下のいずれかの方法で指定します。
- リストで指定
- スライスを使って範囲指定
データ抽出例
以下は loc、ilocメソッド解説用のテストデータです。このデータを使って、両者の違いや記述例を見ていきましょう。抽出において想定されるパターンをいくつか用意したので、パターンごとに解説します。
# テストデータ
import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame(np.random.rand(4, 4), index=['たけし', 'さんま', 'タモリ', '志村'], columns=['A', 'B', 'C', 'D'])
df
A | B | C | D | |
---|---|---|---|---|
たけし | 0.548814 | 0.715189 | 0.602763 | 0.544883 |
さんま | 0.423655 | 0.645894 | 0.437587 | 0.891773 |
タモリ | 0.963663 | 0.383442 | 0.791725 | 0.528895 |
志村 | 0.568045 | 0.925597 | 0.071036 | 0.087129 |
連続したデータの抽出
以下のコードは、行インデックスが「さんま、タモリ」、列名が「B、C」のように連続したデータを抽出したい場合の例です。
何と、4通りの方法があります。
locメソッド(リスト指定)の使用
データフレームの行、列の各ラベル通りに記述します。
display(df)
df.loc[['さんま', 'タモリ'], ['B', 'C']]
A | B | C | D | |
---|---|---|---|---|
たけし | 0.548814 | 0.715189 | 0.602763 | 0.544883 |
さんま | 0.423655 | 0.645894 | 0.437587 | 0.891773 |
タモリ | 0.963663 | 0.383442 | 0.791725 | 0.528895 |
志村 | 0.568045 | 0.925597 | 0.071036 | 0.087129 |
B | C | |
---|---|---|
さんま | 0.645894 | 0.437587 |
タモリ | 0.383442 | 0.791725 |
ilocメソッド(リスト指定)の使用
データフレームの行、列番号の開始位置は 0始まりであることに注意して記述します。
iloc の仕様はリストや配列のインデックス指定と同じです。
display(df)
df.iloc[[1, 2], [1, 2]]
A | B | C | D | |
---|---|---|---|---|
たけし | 0.548814 | 0.715189 | 0.602763 | 0.544883 |
さんま | 0.423655 | 0.645894 | 0.437587 | 0.891773 |
タモリ | 0.963663 | 0.383442 | 0.791725 | 0.528895 |
志村 | 0.568045 | 0.925597 | 0.071036 | 0.087129 |
B | C | |
---|---|---|
さんま | 0.645894 | 0.437587 |
タモリ | 0.383442 | 0.791725 |
locメソッド(範囲指定)の使用
データフレームの行、列の各ラベル通りに記述します。
display(df)
df.loc['さんま':'タモリ', 'B':'C']
A | B | C | D | |
---|---|---|---|---|
たけし | 0.548814 | 0.715189 | 0.602763 | 0.544883 |
さんま | 0.423655 | 0.645894 | 0.437587 | 0.891773 |
タモリ | 0.963663 | 0.383442 | 0.791725 | 0.528895 |
志村 | 0.568045 | 0.925597 | 0.071036 | 0.087129 |
B | C | |
---|---|---|
さんま | 0.645894 | 0.437587 |
タモリ | 0.383442 | 0.791725 |
ilocメソッド(範囲指定)の使用
行なら「志村」の手前まで、列なら「D」の手前までということになります。
iloc の仕様はリストや配列の範囲指定と同じです。
display(df)
df.iloc[1:3, 1:3]
A | B | C | D | |
---|---|---|---|---|
たけし | 0.548814 | 0.715189 | 0.602763 | 0.544883 |
さんま | 0.423655 | 0.645894 | 0.437587 | 0.891773 |
タモリ | 0.963663 | 0.383442 | 0.791725 | 0.528895 |
志村 | 0.568045 | 0.925597 | 0.071036 | 0.087129 |
B | C | |
---|---|---|
さんま | 0.645894 | 0.437587 |
タモリ | 0.383442 | 0.791725 |
改訂版 Pythonユーザのための Jupyter[実践]入門 [ 池内 孝啓、片柳 薫子、@driller ]
隣接していない(飛び飛び)データの抽出
以下のコードは、行インデックスが「たけし、タモリ、志村」、列名が「B、D」のように隣接していない(飛び飛び)データを抽出したい場合の例です。
2通りの方法があります。
locメソッド(リスト指定)の使用
データフレームの行、列の各ラベル通りに記述します。
display(df)
df.loc[['たけし', 'タモリ', '志村'], ['B', 'D']]
A | B | C | D | |
---|---|---|---|---|
たけし | 0.548814 | 0.715189 | 0.602763 | 0.544883 |
さんま | 0.423655 | 0.645894 | 0.437587 | 0.891773 |
タモリ | 0.963663 | 0.383442 | 0.791725 | 0.528895 |
志村 | 0.568045 | 0.925597 | 0.071036 | 0.087129 |
B | D | |
---|---|---|
たけし | 0.715189 | 0.544883 |
タモリ | 0.383442 | 0.528895 |
志村 | 0.925597 | 0.087129 |
ilocメソッド(リスト指定)の使用
データフレームの行、列番号の開始位置は 0始まりであることに注意して記述します。
iloc の仕様はリストや配列のインデックス指定と同じです。
display(df)
df.iloc[[0, 2, 3], [1, 3]]
A | B | C | D | |
---|---|---|---|---|
たけし | 0.548814 | 0.715189 | 0.602763 | 0.544883 |
さんま | 0.423655 | 0.645894 | 0.437587 | 0.891773 |
タモリ | 0.963663 | 0.383442 | 0.791725 | 0.528895 |
志村 | 0.568045 | 0.925597 | 0.071036 | 0.087129 |
B | D | |
---|---|---|
たけし | 0.715189 | 0.544883 |
タモリ | 0.383442 | 0.528895 |
志村 | 0.925597 | 0.087129 |
指定行以上すべて、指定列以下すべてのデータを抽出
以下のコードは、行が「さんま以上すべて」、列が「C以下すべて」のように、指定行以上すべて、指定列以下すべてを抽出したい場合の例です。
2通りの方法があります。
locメソッド(範囲指定)の使用
データフレームの行、列の各ラベル通りに記述します。
display(df)
df.loc['さんま':, :'C']
A | B | C | D | |
---|---|---|---|---|
たけし | 0.548814 | 0.715189 | 0.602763 | 0.544883 |
さんま | 0.423655 | 0.645894 | 0.437587 | 0.891773 |
タモリ | 0.963663 | 0.383442 | 0.791725 | 0.528895 |
志村 | 0.568045 | 0.925597 | 0.071036 | 0.087129 |
A | B | C | |
---|---|---|---|
さんま | 0.423655 | 0.645894 | 0.437587 |
タモリ | 0.963663 | 0.383442 | 0.791725 |
志村 | 0.568045 | 0.925597 | 0.071036 |
ilocメソッド(範囲指定)の使用
iloc の仕様はリストや配列の範囲指定と同じです。
# 記述パターン1
display(df)
df.iloc[1:, :3]
A | B | C | D | |
---|---|---|---|---|
たけし | 0.548814 | 0.715189 | 0.602763 | 0.544883 |
さんま | 0.423655 | 0.645894 | 0.437587 | 0.891773 |
タモリ | 0.963663 | 0.383442 | 0.791725 | 0.528895 |
志村 | 0.568045 | 0.925597 | 0.071036 | 0.087129 |
A | B | C | |
---|---|---|---|
さんま | 0.423655 | 0.645894 | 0.437587 |
タモリ | 0.963663 | 0.383442 | 0.791725 |
志村 | 0.568045 | 0.925597 | 0.071036 |
# 記述パターン2(マイナスのインデックス使用)
display(df)
df.iloc[1:, :-1]
A | B | C | D | |
---|---|---|---|---|
たけし | 0.548814 | 0.715189 | 0.602763 | 0.544883 |
さんま | 0.423655 | 0.645894 | 0.437587 | 0.891773 |
タモリ | 0.963663 | 0.383442 | 0.791725 | 0.528895 |
志村 | 0.568045 | 0.925597 | 0.071036 | 0.087129 |
A | B | C | |
---|---|---|---|
さんま | 0.423655 | 0.645894 | 0.437587 |
タモリ | 0.963663 | 0.383442 | 0.791725 |
志村 | 0.568045 | 0.925597 | 0.071036 |
単一行データの抽出と加工
これまで解説した抽出はすべて複数行データでした。
しかし、loc、ilocメソッドは行データを単一行、つまり Series形式で取得することもできます。
df.iloc[行番号]
以下のコードは、行インデックスが「志村」のデータを抽出しています。
display(df)
shimura = df.loc['志村']
shimura
A | B | C | D | |
---|---|---|---|---|
たけし | 0.548814 | 0.715189 | 0.602763 | 0.544883 |
さんま | 0.423655 | 0.645894 | 0.437587 | 0.891773 |
タモリ | 0.963663 | 0.383442 | 0.791725 | 0.528895 |
志村 | 0.568045 | 0.925597 | 0.071036 | 0.087129 |
A 0.568045
B 0.925597
C 0.071036
D 0.087129
Name: 志村, dtype: float64
Series で取得しているため、例えば A のデータを個別に取得することが可能になります。
shimura.A
0.5680445610939323
また、「志村」の行を更新するということも可能です。
display(df)
df.loc['志村'] = ['shi', 'mura', 'ke', 'n']
df
A | B | C | D | |
---|---|---|---|---|
たけし | 0.548814 | 0.715189 | 0.602763 | 0.544883 |
さんま | 0.423655 | 0.645894 | 0.437587 | 0.891773 |
タモリ | 0.963663 | 0.383442 | 0.791725 | 0.528895 |
志村 | 0.568045 | 0.925597 | 0.071036 | 0.087129 |
A | B | C | D | |
---|---|---|---|---|
たけし | 0.548814 | 0.715189 | 0.602763 | 0.544883 |
さんま | 0.423655 | 0.645894 | 0.437587 | 0.891773 |
タモリ | 0.963663 | 0.383442 | 0.791725 | 0.528895 |
志村 | shi | mura | ke | n |
以上で、pandas.DataFrame の loc、ilocメソッドについての解説を終わります。
シンプルな記述でデータ抽出ができる優れ者なメソッド。今後、存分に扱えるように抽出パターンごとにポイントをしっかりと押さえておくことがとても大切です。
特に「連続したデータの抽出」は記述方法が4通りもあって、覚えたての頃は理解が錯綜しがちになります。まずは自分の好みの方法をきっちり理解したうえで、残る記述方法を少しずつ押さえていくのが一番かと考えます。
1つの方法だけでも確実に理解しているかだけでも、データ抽出・データ分析の効率はかなり違います。
さて、pandas をもっともっと使いこなしたい御方、さらにスキルアップをしてみたい御方は改訂版 Pythonユーザのための Jupyter[実践]入門 [ 池内 孝啓、片柳 薫子、@driller ]がたいへんオススメです。
Jupyter Lab のフル活用方法や、データ分析についてのノウハウも同時に学べて一石二鳥ならぬ、一石三鳥です。
もちろん、初心者にも大変オススメできます。Jupyter Lab自体がインタラクティブな動作確認や視覚効果が本当にすばらしいので、プログラミング学習においての理解度が触るたびに上がっていきます。どんどん触ってPython大好き人間になってもらいたいです。
改訂版 Pythonユーザのための Jupyter[実践]入門 [ 池内 孝啓、片柳 薫子、@driller ]
また、爆速で pandas を学びたい御方にはプログラミングスクールを考えるのも、ひとつの手です。独学よりも効果が出やすいですが、いかんせん投資がけっこうかかります。しかし、techgymというスクールは通うか通わないかは別として、無料のサンプルテキスト&解説動画がもらえます。これをとりあえず getしてまずは試しに体験学習するのもありでしょう。
コメント