note.nkmk.me

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

Date: 2018-01-13 / tags: Python, pandas
このエントリーをはてなブックマークに追加

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

ここでは、

  • set_index()の基本的な使い方
  • indexを別の列に変更(再設定)
  • csvファイルなどの読み込み時にindexを指定
  • index(行名)を使って行や要素を抽出(選択)

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

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

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)にindexとして使用する列の列名(列ラベル)を指定する。

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

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

第一引数(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())についての詳細は以下の記事参照。

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

デフォルトでは元のオブジェクトは変更されず、新たなオブジェクトが返されるが、引数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

indexを別の列に変更(再設定)

indexを別の列に変更(再設定)したい場合、set_index()で別の列を指定すると元のindexが削除されてしまう。

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

ここで、indexを0始まりの連番に振り直すreset_index()を使う。

df_r = df.reset_index()
print(df_r)
#       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

元のindexをデータ列として残しておきたい場合は、reset_index()してからset_index()を用いる。

df_rs = df.reset_index().set_index('state')
print(df_rs)
#           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()については以下の記事も参照。

csvファイルなどの読み込み時にindexを指定

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

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

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ファイルの読み込みについては以下の記事参照。

index(行名)を使って行や要素を抽出(選択)

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

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

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

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

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

関連カテゴリー

関連記事