note.nkmk.me

pandas.DataFrameの列をインデックス(行名)に割り当てるset_index

Date: 2018-01-13 / tags: Python, pandas

set_index()メソッドを使うとpandas.DataFrameの既存の列をインデックス(行名、行ラベル)に割り当てることができる。インデックスに一意の名前を指定しておくと、loc, atで要素を選択(抽出)するとき分かりやすいので便利。

ここでは、

  • set_index()の使い方
    • 基本的な使い方
    • マルチインデックスを割り当て
    • インデックスを別の列に変更(再設定)
    • 元のオブジェクトを変更(引数inplace
  • csvファイルなどの読み込み時にインデックスを指定
  • インデックス(行名)を使って行や要素を抽出(選択)

について、サンプルコードとともに説明する。

例として、以下のデータを使用する。

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

サンプルのcsvファイルはコチラ。

スポンサーリンク

set_index()の基本的な使い方

基本的な使い方

第一引数(keys)にインデックスとして使用する列の列名(列ラベル)を指定する。

df_i = df.set_index('name')
print(df_i)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

マルチインデックスを割り当て

set_index()を使って、複数の列を階層的にインデックスとするマルチインデックスを割り当てられる。マルチインデックスについては以下の記事を参照。

リストで指定

第一引数(keys)に列名(列ラベル)のリストを指定すると、複数の列がマルチインデックスとして割り当てられる。

df_mi = df.set_index(['state', 'name'])
print(df_mi)
#                age  point
# state name               
# NY    Alice     24     64
# CA    Bob       42     92
#       Charlie   18     70
# TX    Dave      68     70
# CA    Ellen     24     88
# NY    Frank     30     57

sort_index()でソートすると綺麗に表示される。

df_mi.sort_index(inplace=True)
print(df_mi)
#                age  point
# state name               
# CA    Bob       42     92
#       Charlie   18     70
#       Ellen     24     88
# NY    Alice     24     64
#       Frank     30     57
# TX    Dave      68     70

ソート(sort_values(), sort_index())についての詳細は以下の記事参照。

引数append

デフォルトではset_index()で新たな列を指定すると、元のインデックスは削除される。

df_ii = df_i.set_index('state')
print(df_ii)
#        age  point
# state            
# NY      24     64
# CA      42     92
# CA      18     70
# TX      68     70
# CA      24     88
# NY      30     57

引数appendTrueとすると、指定した列が新たな階層のインデックスとして追加される。

df_mi = df_i.set_index('state', append=True)
print(df_mi)
#                age  point
# name    state            
# Alice   NY      24     64
# Bob     CA      42     92
# Charlie CA      18     70
# Dave    TX      68     70
# Ellen   CA      24     88
# Frank   NY      30     57

追加された列は一番下の階層となる。階層を入れ替えたい場合はswaplevel()を使う。

print(df_mi.swaplevel(0, 1))
#                age  point
# state name               
# NY    Alice     24     64
# CA    Bob       42     92
#       Charlie   18     70
# TX    Dave      68     70
# CA    Ellen     24     88
# NY    Frank     30     57

インデックスを別の列に変更(再設定)

set_index()で別の列を指定すると上の例のように元のインデックスが削除されてしまう。

元のインデックスを残したい場合は、インデックスを0始まりの連番に振り直すreset_index()を使う。

df_ri = df_i.reset_index()
print(df_ri)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

インデックスを別の列に変更(再設定)したい場合はreset_index()のあとでset_index()を用いればよい。一気に書くと以下のようになる。

df_change = df_i.reset_index().set_index('state')
print(df_change)
#           name  age  point
# state                     
# NY       Alice   24     64
# CA         Bob   42     92
# CA     Charlie   18     70
# TX        Dave   68     70
# CA       Ellen   24     88
# NY       Frank   30     57

reset_index()については以下の記事も参照。

元のオブジェクトを変更(引数inplace)

デフォルトではset_index()で元のオブジェクトは変更されず、新たなオブジェクトが返されるが、引数inplaceTrueとすると元のオブジェクトが変更される。

df.set_index('name', inplace=True)
print(df)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

csvファイルなどの読み込み時にインデックスを指定

csvファイルなどから読み込んでpandas.DataFrameあるいはpandas.Seriesを生成する場合、もともとのファイルにインデックスとして使うべき列が含まれていれば、読み込み時に指定することもできる。

read_csv()でファイルを読み込む場合は、引数index_colに列番号を指定するとその列がインデックスとなる。

df = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
print(df)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

csvファイルやtsvファイルの読み込みについては以下の記事参照。

インデックス(行名)を使って行や要素を抽出(選択)

これまでの例のように、インデックス(行名、行ラベル)に一意の文字列などを指定すると、行や要素を名前で抽出(選択)できるようになる。

print(df)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

print(df.loc['Bob'])
# age      42
# state    CA
# point    92
# Name: Bob, dtype: object

print(df.at['Bob', 'age'])
# 42

locatについては以下の記事を参照。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事