Indexing, Selecting & Assigning | Kaggle
Indexing in pandas
df.loc[index], df.iloc[index] でもデータにアクセスできる。df.loc() と関数(メソッド)呼び出しではないので注意。
Python の dict[array] とか array[array] のようなデータ構造は、列→行の順番でセルにアクセスするのに対して、loc/iloc は行→列の順番でアクセスする。
Index-based selection
添字(数字)でアクセスする場合は iloc を使う(i == index という意味だと思う)。
ある一行を取るには df.iloc[0] のように添字でアクセスする。
ある一列を取るには df.iloc[:, 0] のようにアクセスする。: は Python のスライスによる全範囲指定。最初の列の一行目と二行目が欲しいなら df.iloc[1:3, 0] と書く。スライスではなくリストを与えて df.iloc[[1,2], 0] のようにも書ける。
とても便利なマイナスの添字も使える。df.iloc[-5, 0] でラスト 5 行を取得する(ちなみにこれは df.tail() と同じ)。
Label-based selection
数字でデータの位置(番地)を指定するのではなく、ラベル(列名の文字列)でアクセスするには loc を使う。
最初の行の foo 列の値を得るには df.loc[0, 'foo'] と書く。
巨大な DataFrame を扱う場合は、列を番号で指定する iloc よりも列名で指定する loc の方が理解しやすい。一方で、iloc も機械的にアクセスする際は使い勝手が良い場面も多そう。
注意点として、 iloc は添字のスライスを Python ネイティブのスライスと同様に扱う。 iloc[0:10] は 0 番目から 9 番目を表す(終端は含まれない)。一方で loc は終端を含む(loc[0:10] は 0 番目から 10 番目を表す)。
なぜそのような違いがあるのかというと、loc は添字に数字以外(典型的には、文字列)も使えるから。df.loc['Apples':'Potatoes']
vs df.loc['Apples', 'Potatoet']
(typo ではない)。
Manipulating the index
インデックスは後から変更できる。
df = pd.DataFrame({'Id': [0, 1, 2, 3, 4], 'Symbol': ['A', 'B', 'C', 'D', 'E'], 'Code word': ['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo']}) print(df) df2 = df.set_index('Symbol') print(df2)
Id Symbol Code word 0 0 A Alpha 1 1 B Bravo 2 2 C Charlie 3 3 D Delta 4 4 E Echo Id Code word Symbol A 0 Alpha B 1 Bravo C 2 Charlie D 3 Delta E 4 Echo
なるほど?ちょっとピンと来ていない感じがする。
関係ないけど pd.DataFrame() で dict などのデータ構造から DataFrame を作るときに直接 index を指定するオプションはないみたい。作ってから set_index とかする。
今日はここまで。まだ Lesson 2 の途中だけど、今日だけでもずいぶん多くのことを学んだ。Pandas のコースをやってよかった。