▶ Pandasを基本から解説しています。Series/DataFrameの作り方は以下をご覧ください。
はじめに
今回はDataFrameの基本操作である、行や列を指定したデータの抽出方法の基本を確認していきます。列の指定・行の指定をいろいろなパターンでみていきましょう。行の指定では、ラベルが設定されている場合とされていない場合にわけて基本の抽出方法をじっくりみていくことにしましょう。
データの抽出
列(Columns)を指定してデータを抽出する
まずはデータフレームから列を指定してデータを抽出する方法を確認しましょう。角括弧[]で列名を指定することで対象のデータを抽出することができます。やってみましょう。
# ライブラリのインポート
import numpy as np
import pandas as pd
# サンプルデータの作成
df = pd.DataFrame(np.arange(24).reshape(6,4),columns=['A','B','C','D'])
df
まずサンプルのデータフレームを作りました。A-Dの列があります。ここからA列だけを取り出してみましょう。
# A列だけを取り出す
df['A']
このようにデータフレームに対して角括弧[]で列名を指定するだけでデータを取り出すことができます。このとき、抽出されたデータはSeriesとなっています。
今回の例のような一つの列だけでなく、複数の列を取り出す場合も見てみましょう。A列とC列を取り出してみます。
# A列とC列を取り出す
df[['A','C']]
複数の列を抽出する場合は角括弧の中の列名をリストで指定します。このとき、抽出されたデータはDataFrameとなっています。
1つの列を指定して(Seriesではなく)DataFrameとしてデータを抽出したい場合は、[‘A’]のように列をリストで指定することで可能です。
# 1つの列をリストで指定
df[['A']]
このように列が1つの場合でも角括弧[]の中をリストで指定すると、データフレームで抽出することができます。
行(index)を指定してデータを抽出する
次に行を指定してデータを抽出する方法を確認していきましょう。行(index)はラベルが設定されていない場合とされている場合がありますね。通常はラベルを振らずに連番となっていることの方が多いかと思います。ラベルが振られていない場合とラベルが振られている場合に分けて整理しましょう。
行(index)にラベルが振られていない場合
行にラベルが振られていない場合はiloc()を使います。次の書式となります。
[]内でindexを数字で指定することとデータフレームから行のSeriesを抽出することができます。やってみましょう。
# データの確認
print(df)
# indexを番号で指定
df.iloc[2]
このようにilocでは数字で行のindexを指定することができます。ilocでindexの番号2を指定したので、赤枠の部分が抽出されています。
ilocではスライス表現も使うことができます。
# indexをスライスで指定
df.iloc[2:5]
このようにindexをスライスで指定することもできます。ilocでindex番号をスライス表現で指定する場合は始点は含み終点は含まないため、df.iloc[2:5]では赤枠で示したようにindexが2,3,4のものが抽出されます。
行(index)にラベルが振られている場合
次に行にラベルが振られている場合を見ていきましょう。loc()を使います。
[]内では、indexに設定されているラベルを指定することで、データフレームからSeries(1つの行を指定)やデータフレーム(複数の行を指定)を抽出することができます。
# dfのindexにラベルを設定
df.index = ['row1','row2','row3','row4','row5','row6']
print(df)
# ラベルの付いたindexを指定
df.loc['row4']
このように指定したrow4の行が取り出せます。次にスライス表現を見てみましょう。
# データの確認
print(df)
# ラベルの付いたindexをスライスで指定
df.loc['row2':'row5']
このようにラベルの付いたindexをスライスで指定することもできます。locでiスライス表現で指定する場合は始点も終点も含むため、df.loc[’row2’:’row5′]では赤枠で示したようにrow2,row3,row4,row5,が抽出されます。
そのためindexに明示的にラベルを付けていないときにlocを使うときには注意してください。ラベルを明示的に指定していないときには、indexに連番が振られています。このとき、ilocだけでなくlocを使うこともできますが、スライス表現した時に抽出されるデータは異なります。この例を見ておきましょう。
# サンプルデータの再作成
df = pd.DataFrame(np.arange(24).reshape(6,4),columns=['A','B','C','D'])
print(df)
# ilocでスライス
print('iloc[2:5]で抽出')
print(df.iloc[2:5])
# locでスライス
print('loc[2:5]で抽出')
print(df.loc[2:5])
このようにilocでは終点が含まれない、locでは終点が含まれる、という違いがあるので注意が必要です。
今回はloc, ilocの行の指定だけを見てきましたが、列の指定をすることもできます。
▶ loc, iloc を使って行だけでなく列の指定もできます。以下の記事をご覧ください。
まとめ
今回はデータフレームから行・列を抽出する基本を扱いました。列は角括弧[]で抽出する、行はilocあるいはlocで抽出する、というのが基本となります。扱った内容を以下にまとめておきましょう。
コメント