note.nkmk.me

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

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

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

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

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

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については以下の記事を参照。

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

関連カテゴリー

関連記事