機械学習
記事内に商品プロモーションを含む場合があります

Pandasのlocとilocの違いと使い分けを詳しく解説|Python

Aru

Pythonのpandasは表形式のデータを操作する強力なライブラリです。pandasでは、行や列を選択する方法としてlocilocが存在しています。この記事では、両者の違いと使い方について詳しく解説します。pandasを使う場合の基本となる部分なので、理解しておきましょう。

locとilocの違いについて

端的に言えば、locilocの違いはラベルベースでデータを選択するのか位置ベースでデータを選択するのかの違いです。それぞれ、以下のようになります。

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, 都市: 福岡
loc, ilocを使わないとワーニングが出る場合がある

ilocやlocを使わないと、設定代入(SettingWithCopyWarning)に関する警告が頻繁に出ることがあります

例えば、以下のようなコードでワーニングがでます。また、dfは変更されません。

df[df['名前']=='花子']['年齢'] = 29
print(df)

この警告は、データフレームのスライスやフィルタリングの結果がビューであるかコピーであるかが不明確な場合に発生します。上の場合は、df[df['名前']=='花子']の結果はコピーであるため、元のdfは更新されません

このような場合、以下のようにlocを使って書けば解決します

df.loc[df['名前']=='花子','年齢'] = 29
print(df)

とりあえず、書き換えを行う場合はlocilocを使うようにしておけば問題を回避できます。

まとめ

locilocの違いと使い方について解説しました。以下にポイントをまとめます。

  • loc
    名前を使ってデータを選択
  • iloc
    インデックス番号を使ってデータを選択

最初は、この2つの違いがわかりにくいかと思いますが慣れてくるとどちらを使えばよいのかすぐにわかるようになるかと思います。

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
ある/Aru
ある/Aru
IT&機械学習エンジニア/ファイナンシャルプランナー(CFP®)
専門分野は並列処理・画像処理・機械学習・ディープラーニング。プログラミング言語はC, C++, Go, Pythonを中心として色々利用。現在は、Kaggle, 競プロなどをしながら悠々自適に活動中
記事URLをコピーしました