Python

Python初学者向け:DataFrameの基本操作を解説(行・列の抽出)

スポンサーリンク

 

この記事はこんな方におススメです
  • Pythonを始めたばかりで基本から学びたい方
  • Pythonの基本的な部分を速習してまずは全体像を把握しておきたい方

▶ 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']
A列を指定して取り出す

このようにデータフレームに対して角括弧[]で列名を指定するだけでデータを取り出すことができます。このとき、抽出されたデータはSeriesとなっています。

今回の例のような一つの列だけでなく、複数の列を取り出す場合も見てみましょう。A列とC列を取り出してみます。

# A列とC列を取り出す
df[['A','C']]
A列とC列を取り出す

複数の列を抽出する場合は角括弧の中の列名をリストで指定します。このとき、抽出されたデータはDataFrameとなっています。

1つの列を指定して(Seriesではなく)DataFrameとしてデータを抽出したい場合は、[‘A’]のように列をリストで指定することで可能です。

# 1つの列をリストで指定
df[['A']]
# 1つの列をリストで指定

このように列が1つの場合でも角括弧[]の中をリストで指定すると、データフレームで抽出することができます。

  • 角括弧[]で列を指定することでデータを抽出できる
  • df[‘列名’]で抽出するとSeriesでデータが抽出される
  • df[[‘列名’]]で抽出するとDataFrameでデータが抽出される
  • 複数の列を指定する場合はdf[[列名1, 列名2,…]]とするとDataFrameでデータが抽出される

行(index)を指定してデータを抽出する

次に行を指定してデータを抽出する方法を確認していきましょう。行(index)はラベルが設定されていない場合とされている場合がありますね。通常はラベルを振らずに連番となっていることの方が多いかと思います。ラベルが振られていない場合とラベルが振られている場合に分けて整理しましょう。

行(index)にラベルが振られていない場合

行にラベルが振られていない場合はiloc()を使います。次の書式となります。

df.iloc[]

[]内でindexを数字で指定することとデータフレームから行のSeriesを抽出することができます。やってみましょう。

# データの確認
print(df)

# indexを番号で指定
df.iloc[2]
ilocでindex番号を指定して抽出

このようにilocでは数字で行のindexを指定することができます。ilocでindexの番号2を指定したので、赤枠の部分が抽出されています。

ilocではスライス表現も使うことができます。

# indexをスライスで指定
df.iloc[2:5]
# indexをスライスで指定

このようにindexをスライスで指定することもできます。ilocでindex番号をスライス表現で指定する場合は始点は含み終点は含まないため、df.iloc[2:5]では赤枠で示したようにindexが2,3,4のものが抽出されます。

行(index)にラベルが振られている場合

次に行にラベルが振られている場合を見ていきましょう。loc()を使います。

df.loc[]

[]内では、indexに設定されているラベルを指定することで、データフレームからSeries(1つの行を指定)やデータフレーム(複数の行を指定)を抽出することができます。

# dfのindexにラベルを設定
df.index = ['row1','row2','row3','row4','row5','row6']
print(df)

# ラベルの付いたindexを指定
df.loc['row4']
ラベルの付いたindexを指定してデータを抽出

このように指定したrow4の行が取り出せます。次にスライス表現を見てみましょう。

# データの確認
print(df)

# ラベルの付いたindexをスライスで指定
df.loc['row2':'row5']
ラベルの付いたindexをスライスで指定

このようにラベルの付いた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])
locとilocのときのスライス表現で抽出されるデータの違い

このようにilocでは終点が含まれない、locでは終点が含まれる、という違いがあるので注意が必要です。

今回はloc, ilocの行の指定だけを見てきましたが、列の指定をすることもできます。

▶ loc, iloc を使って行だけでなく列の指定もできます。以下の記事をご覧ください。

スポンサーリンク

まとめ

今回はデータフレームから行・列を抽出する基本を扱いました。列は角括弧[]で抽出する、行はilocあるいはlocで抽出する、というのが基本となります。扱った内容を以下にまとめておきましょう。

  • 列は[]内で1つの列名を文字列で指定するとSeriesで抽出
  • 列は[]内で列名の文字列をリストで指定するとデータフレームで抽出
    ※列名が1つでもリストで指定するとデータフレームで抽出
  • 行はdf.ilocでindexを数字で1つ指定するとSeriesで抽出
  • 行はdf.ilocでindexを数字のリストで指定するとデータフレームで抽出
    ※指定するindexの数字が1つでもリストで指定するとデータフレームで抽出
  • 行はdf.locでindexのラベルを指定することができる。文字列で1つ指定した場合はSeriesで抽出
  • 行はdf.locでindexのラベルをリストで指定するとデータフレームで抽出
    ※指定するindexのラベルが1つでもリストで指定するとデータフレームで抽出
  • 行はilocでもlocでもスライス表現を使うことができるが、ilocは終点を含まない、locは終点を含む、という違いがある

コメント

タイトルとURLをコピーしました