@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Kaggle: Pandas のコースに着手: Lesson 2

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 のコースをやってよかった。

Fork of notebook74634c4af3 | Kaggle

www.kaggle.com