Pandasのlocとilocの違いと使い分けを詳しく解説|Python
Pythonのpandasは表形式のデータを操作する強力なライブラリです。pandasでは、行や列を選択する方法としてloc
とiloc
が存在しています。この記事では、両者の違いと使い方について詳しく解説します。pandasを使う場合の基本となる部分なので、理解しておきましょう。
locとilocの違いについて
端的に言えば、loc
とiloc
の違いはラベルベースでデータを選択するのか、位置ベースでデータを選択するのかの違いです。それぞれ、以下のようになります。
行や列のラベル(名前)を使ってデータを選択する選択方法
行や列の位置(インデックス)を使ってデータを選択する選択方法
つまり、行ラベルや列名で参照するか、位置(数値)で参照するのかの違いです。
名前で参照する場合はloc
, インデックスで参照する場合はiloc
と覚えておきましょう。
表形式のデータを加工するときに、iloc, locは頻繁に使用しますので違いを理解しておくことは重要です
以下、実際の例を使って、両者の違いを解説したいと思います。
説明に使うデータセット
両者の違いを説明するために、以下のデータセットを利用します。
import pandas as pd
data = {'名前': ['太郎', '花子', '次郎', '三郎'],
'年齢': [25, 30, 35, 40],
'都市': ['東京', '大阪', '名古屋', '福岡']}
df = pd.DataFrame(data)
locの使い方
基本操作
基本は、行と列のラベルを指定してデータを選択する方法です。
サンプルのデータセットでは、行ラベルが1、列ラベルが”名前”の値は花子になります。
print(df.loc[1, '名前'])
# 花子
複数行・列の選択
複数の行や列を選択する場合は、リストを使って指定を行います。
print(df.loc[[0, 2], ['名前', '年齢']])
# 名前 年齢
# 0 太郎 25
# 2 次郎 35
スライシング
スライシングとは範囲指定のことです。範囲を指定してデータを選択することも可能です。
以下は、0〜2のラベルの範囲を選択しています。
print(df.loc[0:2, ['名前', '年齢']])
# 名前 年齢
# 0 太郎 25
# 1 花子 30
# 2 次郎 35
ラベルが文字列の場合は、以下のようにして範囲選択することができます。この例では、名前と都市の間に含まれる列が表示されます。
print(df.loc[[0, 2], '名前':'都市'])
# 名前 年齢 都市
# 0 太郎 25 東京
# 2 次郎 35 名古屋
条件選択
条件と一致する行を選択することも可能です。
print(df.loc[df['年齢'] >= 30, '名前'])
# 名前 年齢
# 1 花子 30
# 2 次郎 35
# 3 三郎 40
ilocの使い方
基本操作
iloc
では、行、列のインデックス番号を指定します。
print(df.iloc[1, 0])
# 花子
複数行・列の選択
リストで渡すことで、複数の行、列を指定可能です。ilocは位置を指定するので、それぞれ整数値となります。
print(df.iloc[[0, 2], [0, 1]])
# 名前 年齢
# 0 太郎 25
# 2 次郎 35
スライシング
範囲指定をして選択することも可能です。範囲指定はインデックス番号(整数値)になります。
print(df.iloc[0:2, :2])
# 名前 年齢
# 0 太郎 25
# 1 花子 30
範囲指定をインデックスですることが多いのでilocの方がよく使う印象です。
for文でループする場合
for
文で行方向にループさせる場合は、iloc
を使います。
以下の例では、各行の要素を取り出して表示しています。
for i in range(len(df)):
name, age, city = df.iloc[i]
print(f"名前: {name}, 年齢: {age}, 都市: {city}")
# 名前: 太郎, 年齢: 25, 都市: 東京
# 名前: 花子, 年齢: 30, 都市: 大阪
# 名前: 次郎, 年齢: 35, 都市: 名古屋
# 名前: 三郎, 年齢: 40, 都市: 福岡
ilocやlocを使わないと、設定代入(SettingWithCopyWarning)に関する警告が頻繁に出ることがあります。
例えば、以下のようなコードでワーニングがでます。また、dfは変更されません。
df[df['名前']=='花子']['年齢'] = 29
print(df)
この警告は、データフレームのスライスやフィルタリングの結果がビューであるかコピーであるかが不明確な場合に発生します。上の場合は、df[df['名前']=='花子']
の結果はコピーであるため、元のdfは更新されません。
このような場合、以下のようにlocを使って書けば解決します
df.loc[df['名前']=='花子','年齢'] = 29
print(df)
とりあえず、書き換えを行う場合はloc
かiloc
を使うようにしておけば問題を回避できます。
まとめ
loc
とiloc
の違いと使い方について解説しました。以下にポイントをまとめます。
- loc
名前を使ってデータを選択 - iloc
インデックス番号を使ってデータを選択
最初は、この2つの違いがわかりにくいかと思いますが慣れてくるとどちらを使えばよいのかすぐにわかるようになるかと思います。