【Python】Pandasの基礎と使い方2 – at, iat, loc, iloc使い方(DataFrame要素, 行, 列の取得・代入)

みなさんこんにちは、ZeroTerasu(@ZeroTerasu)です。

今回は、前回の記事で解説したPandasライブラリで作成したDataFrameの各要素の抽出・代入・削除の方法について解説致します。

DataFrameのインデックス参照, at, iat, loc, ilocという5つのメソッドについて解説します。

DataFrameの基本となる操作になりますのでマスター頂ければ幸いです。

尚、今回は下記のDataFrameを用いて解説していきます。

※本記事のメインの解説は、indexを指定しないDataFrameについての処理についてです。indexに特定列を指定した場合の処理についても各項目の下部に記載しておりますので、併せてご参照下さい。

今回使用するDataFrame(index指定無し)
名前国語数学英語
0佐藤さん657085
1鈴木さん807260
2田中さん908055
ソースコード
import pandas as pd

df = pd.DataFrame({
    '名前':['佐藤さん', '鈴木さん', '田中さん'],
    '国語':[65, 80, 90],
    '数学':[70, 72, 80],
    '英語':[85, 60, 55],
})

※注意※

上述の通り、メインの解説用のDataFrameは、indexを指定せずに作成していますが、indexに特定の列を指定している場合(下記にサンプル掲載)は、「引数=”行番号”」の箇所は=>「引数=”行名”」で指定する必要がありますので、注意下さい。

indexに特定の列を指定した場合のDataFrame
import pandas as pd

df = pd.DataFrame({
    '名前':['佐藤さん', '鈴木さん', '田中さん'],
    '国語':[65, 80, 90],
    '数学':[70, 72, 80],
    '英語':[85, 60, 55],
})
df.set_index('名前', inplace=True)
df

国語数学英語
名前
佐藤さん657085
鈴木さん807260
田中さん908055
DataFrameのindexに特定列を指定すると、index番号の表示が消え、指定した列の列ラベル(上記では、”名前”)が他の列の列ラベルより1行下の行に出力される。

要素の取得方法1 = インデックス参照(df[‘列名’][行番号] )

要素の取得:df[‘列名’][行番号]

最もシンプルにDataFrameの要素を取得する方法は、DataFrameの列名および行番号を[]で指定する方法です。

また、データ取得の他に

下記の例では、佐藤さんの国語の点数を取得しています。

列名 => 行番号 の順番に指定する必要がありますので注意が必要です。

df['国語'][0]
# 実行結果 65

また、指定した要素に対して値を代入することもできます。

要素の取得:df[‘列名’][‘行名’] ※DataFrameのindexに特定の列を指定している場合

DataFrameのindexに特定の列(本記事では、名前‘列をindexに指定)を指定している場合は、要素の行は”行名”で指定する。

df['佐藤さん']['国語']
# 実行結果 65

要素の代入:df[‘列名’][行番号] = 値

但し、下記のように警告が表示されますので、要素への代入は後のat[], iat[], loc[], iloc[]の使用を推奨致します。

df['国語'][0] = 100
# c:\Users\anaconda3\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning: 
# A value is trying to be set on a copy of a slice from a DataFrame

# See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
#   """Entry point for launching an IPython kernel.
#   名前	  国語 数学 英語
# 0	佐藤さん	100	70	85
# 1	鈴木さん	80	72	60
# 2	田中さん	90	80	55

上記のように”名前”をindexに指定したDataFrameの場合の引数指定は下記のようになります。

単列の取得:df[‘列名’]

DataFrame[‘列名’]のように、引数に列名のみ指定した場合、対象の列をSeries型で返します。

df['国語']
# 実行結果 
# 0    65
# 1    80
# 2    90
# Name: 国語, dtype: int64

複数列の取得:df[[‘列名’, ‘列名’]]

DataFrame[[‘列名’,’列名’]]のように2次元配列で指定することで複数列の取得が可能です。対象の列をDataFrame型で返します。

df[['国語','数学']]

# 	    国語 数学
# 名前		
# 佐藤さん	 65	 70
# 鈴木さん	 80	 72
# 田中さん	 90	 80

行の取得:df[‘行名’:’行名’] or df[行番号:行番号]

・インデックス参照でを取得するためには、スライスを使います。

複数行の取得が可能です。

1行のみの取得の場合もスライスを使用する必要があります。(引数に1行の行名 または 行番号だけを指定してもエラーになります。)

・行名 または 行番号何れかの指定で統一します。(行名:行番号 のように混在指定するとエラーとなります。)

インデックスを指定していない場合、行番号の指定のみ適用可能です。

# インデックスをしていない場合 # <= リスト表記の[start:end:step]のendは除外されるため注意。
df[0:1]
# 実行結果
#    名前	  国語	数学 英語
# 0	  佐藤さん	65	70	85

# 以下は、インデックスに'名前'を指定している場合
df['佐藤さん':'鈴木さん']
# 	    国語 数学	英語
# 名前			
# 佐藤さん	 65	 70	  85
# 鈴木さん	 80	 72	  60

df[0:2] # <= リスト表記の[start:end:step]のendは除外されるため注意。
# 	    国語 数学	英語
# 名前			
# 佐藤さん	 65	 70	  85
# 鈴木さん	 80	 72	  60

df[0:3:2] # <= 通常のリスト表記同様に、[start:end:step]のstepも使用可能です。

# 	    国語 数学	英語
# 名前			
# 佐藤さん	 65	  70	  85
# 田中さん	 90	   80	  55

要素の取得方法-2 = df.at[行番号, 列名]

要素の取得:df.at[行番号, 列名]

at[]メソッドでは、引数に行番号と列名を指定することでDataFrame内の特定の要素を取得することが出来ます。

尚、本メソッドは、[]を使用することに注意が必要です。(”()”ではないのでご注意下さい。)

df.at[0,'国語']
# 実行結果 65

要素の取得:df.at[行名, 列名] ※DataFrameのindexに特定の列を指定している場合

df.at['佐藤さん','国語']
# 実行結果 65

要素の取得方法-3 = df.iat[行番号, 列番号]

要素の取得:df.iat[行番号, 列番号]

iat[]メソッドでは、引数に行番号と列番号を指定することでDataFrame内の特定の要素を取得することが出来ます。

# indexが指定されていないDataFrameに対する処理
df.iat[0,1]
# 実行結果 65

尚、indexに特定列を指定している場合も、引数は行番号と列番号の指定となりますが、列番号のカウントにデフォルトのindex番号列がカウントされないことに注意して下さい。

# indexに'名前'を指定したDataFrameに対する処理
df.iat[0,0]
# 実行結果 65
# indexに'名前'列が指定されており、'名前'列は列数のカウントから除外されます。
# そのため、'国語'列が1番目の列(列のインデックス番号=0)となります。

要素の取得方法-4 = df.loc[行名, 列名]

行・列の取得:df.loc[行名:行名, 列名:列名]

・locの引数である行名 と 列名 をそれぞれスライスで指定することで行、列の取得が可能です。

# 行の取得
df.loc['佐藤さん':'鈴木さん',:]

#          国語	数学 英語
# 名前			
# 佐藤さん	 65	  70	 85
# 鈴木さん	 80	  72	 60

# 列の取得
df.loc[:,'国語':'数学']
# 	    国語	 数学
# 名前		
# 佐藤さん	 65	  70
# 鈴木さん	 80	  72
# 田中さん	 90	  80

# 行、列 どちらも指定してデータ取得
df.loc['佐藤さん':'鈴木さん','国語':'数学']
# 	    国語  数学
# 名前		
# 佐藤さん 	65	  70
# 鈴木さん	  80	  72

要素の取得:df.loc[行名, 列名]

“loc = location”の略というのが有力のようです。(検索して頂ければわかりますが、真相は不明とのことです。)

loc[]メソッドでは、引数に行号と列名を指定することでDataFrame内の特定の要素を取得することが出来ます。

# loc[]メソッドの引数には、本来"行名"と"列名"を使用します。
# 説明の都合上、まずはindexに'名前'を指定した場合の処理を記述します。
df.loc['佐藤さん', '国語'] #<=indexに'名前'を指定したDataFrameに対する処理
# 実行結果 65

# 一方、indexを指定しないDataFrameに対しては、'行名'の箇所は'行番号'となります。
df.loc[0, '国語'] #<= indexを指定しないDataFrameに対する処理
# 実行結果 65

要素の取得方法-5 = df.iloc[行番号, 列番号]

要素の取得:df.iloc[行番号, 列番号]

“iloc = index location”の略と認識しています。

loc[]メソッドでは、引数に行番号と列番号を指定することでDataFrame内の特定の要素を取得することが出来ます。

# indexを指定しない場合
df.iloc[0, 1]
# 実行結果 65

# indexに'名前'を指定している場合
df.iloc[0, 0]
# 実行結果 65

行・列の取得:df.iloc[行番号:行番号, 列番号:列番号] or df.iloc[[行番号,行番号], [列番号,列番号]]

・ilocの引数である行番号 と 列番号 をそれぞれスライスで指定することで行、列の取得が可能です。

・行番号 と 列番号は、それぞれリスト形式で指定することも可能。

df.iloc[0:1,:] # df.iloc[[0,1],:]としても同じ結果が得られます。

#          国語	数学 英語
# 名前			
# 佐藤さん	 65	  70	 85
# 鈴木さん	 80	  72	 60

# 列の取得
df.iloc[:,0:1] # df.iloc[:,[0,1]]としても同じ結果が得られます。
# 	    国語	 数学
# 名前		
# 佐藤さん	 65	  70
# 鈴木さん	 80	  72
# 田中さん	 90	  80

# 行、列 どちらも指定してデータ取得
df.loc[0:1,0:1] # df.iloc[[0,1],[0,1]]としても同じ結果が得られます。
# 	    国語  数学
# 名前		
# 佐藤さん 	65	  70
# 鈴木さん	  80	  72

コメント

タイトルとURLをコピーしました