【入門】C#技術者の為のPython独学!データフレーム基礎編

Python入門
この記事は約10分で読めます。

今回はテーブル型のデータを扱うデータフレームについても解説です。

C#でいうところのDataTableだと考えていただければイメージし易いでしょう。

ただ、データフレームの方が高機能であり、且つDataTableより簡単な記述でデータの抽出や更新ができます。

DataFrameの構造

最初にDataFrameの構造について、DataTableと比較してみましょう。

下記の図は左がDataTable,右がDataFrameになります。

両方ともテーブル構造のデータを保持する点は同じですが、DataFrameは次の点が異なります。

  • DataFrameは行に任意の名前を付けることが出来る
  • セル位置の指定は列、行の順番で指定(DataTableは行、列で指定)
  • 列名を設定しなければ列番号を使えるが、設定した後は列番号が使えなくなる
  • 1つの列に異なる型の値が登録できる(例:1列目1行に123,2行目に’ABC’等)

データフレームから特定の列を抜き出すことができるのですが、抜き出したデータはSeries という型になります。

この概念はC#のDataTableにはありませんが、例えるなら列名を1つだけ保持するDataTableみたいなものです。

最初の準備(インストールとインポート)

データフレームは pandas というパッケージ(ライブラリ)をインポートすることで使えます。

pandas はPythonに標準搭載しているわけではないのですが、Anaconda をインストールするとPythonと一緒にインストールされます。

従って、プログラムの先頭に次の1行を記述するだけで使えるようになります。

もし インストールされていない場合は、次のコマンドを実行することでインストールできます。

だいたいどのサンプルを見ても、pandas は pd という略称で使われることが多いようです。

また、データフレームのインスタンスは df と記述されている事が多いので、この記事でも df を使います。

df の記述があれば、データフレームのインスタンスであると解釈して下さい。

データフレームの作成

空のデータフレームを作成する場合は次のようになります。

一方、任意の行列データ初期化したデータフレームを作る場合、第一引数にリスト又はタプルの配列として値を指定します。

例えば、2行3列のデータフレームを作成する場合、1行目を[1,2,3]、2行目を[4,5,6]で初期化すると次のようになります。

次に、初期化する際に列名と行名を指定してみましょう。

indexとcolumnの引数にリストまたはタプルで名前を列挙します。

この時、実際の列数、行数と同じ個数で名前を登録しないとエラーになりますのでご注意ください。

結果は次のようになります。

col1col2col3
row1123
row2456

列名や行名を後から付けたり、内容を変更する場合は index プロパティ、column プロパティにリスト又はタプルで名前をセットします。

結果は次のようになります。

ColNo1ColNo2ColNo3
RowNo1123
RowNo2456

特定の要素(セル)へのアクセス方法

冒頭にも軽く説明しましたが、列と行を指定することで任意のセルにアクセス可能です。

とはいえ、データフレームはいくつもの指定方法が用意されていますので、ここで整理しておきたいと思います。

添え字による指定

列名、行名を指定が設定されていない場合は、列番号、行番号で指定できますが、列名、行名を設定する場合は少しだけ注意が必要で、列名を登録した時点で列番号による指定ができなくなります。

これは、列名、行名の初期値として0から始まる数値の連番が設定されていると解釈できます。

列名無し列名有り
行名無し[列番号][行番号][列名][行番号]
行名有り[列番号][行番号]
[列番号][行名]
[列名][行番号]
[列名][行名]

列名/行名のプロパティを用いた指定

列名や行名を設定すると、データフレームにその列名、行名のプロパティが自動生成されるので、それを使って値の参照や登録が可能になります。

loc 、iloc を使った指定

loc の添え字で列と行を指定することも可能です。

注意点としては、loc に指定する添え字の順番は、DataTableと同様に行、列の順で指定するという点です。

df.loc [行名,列名]  (尚、名前を設定していない場合は列又は行番号での指定が可能)

行名、列名を設定していなければ行番号、列番号での指定が可能ですが、行名、列名を設定してしまうと、その時点で行番号、列番号は使えなくなります。

loc を使わない場合、行については名前を設定しても行番号が使えましたので、より厳しくなっています。

一方、列名の設定有無に関わらず、行番号、列番号で指定したい場合の為に iloc が用意されています。

  df.iloc [行番号,列番号] 

行に列に名前を付けてアクセスしたい場合は loc、単純に行番号、列番号でアクセスしたい場合は iloc という具合に使い分けましょう。

at を使った指定

at も loc と同様に行と列を指定することでセルにアクセスするのですが、 loc との違いは速度です。

at は1つのセルに対してアクセスすることに特化した作りになっています。

loc は汎用的な仕様になっており、列だけを取り出したり、スライサーを使って指定範囲を取り出す事が可能な分、at より処理速度が劣るのです。

at はloc と同様に行名、列名を使う at と、常に行番号、列番号を使う iat が用意されています。

 df.at [行名,列名]  (尚、名前を設定していない場合は列又は行番号での指定が可能)

 df.iat[行番号,列番号] 

大量のデータに対して、行と列を指定して処理するような場合は at の方が向いています。

特定の行、又は列の操作

説明の前に以下のデータフレームがあると仮定しておきます。

col1col2col3col4col5
row11020304050
row21121314151
row31222324252
row21323334353
row51424344454

特定の列の操作

列名を指定するだけで抜き出すことが可能です。

  df[列名]   

返される値は Series 型になります。

新しい列を追加する場合は、新しい列名を指定して、行数だけ値を用意したリスト又はタプルを代入します。

下記の様に記述すれば、’col6′ という列がデータフレームの右端に新たに追加されます。

同様に、Seriesを使ってデータフレームを追加することも可能です。

この場合は、データフレームの列名とSeriesの名前、及び行数を一致させる必要があります。

もし行名を設定している場合、行名も指定しなければなりません。

従って、df[‘col6’] = [60,61,62,63,64] は次のような記述になります。

列名を指定するのは面倒ですが、データフレームへの代入時、Seriesの名前や列名が存在しているもののみ処理してくれるので、既存のデータフレームに対して一部のみを書き換える場合には便利です。

さて、既存の列だけを取り出した場合、Series 型が返され、Series 型をデータフレームを追加したり、任意の列を上書きすることができました。

この機能を利用すると、データフレームの特定の列に演算を行うことが簡単にできてしまいます。

例えば、’col5′ の内容を2乗するような場合は次のように記述すれば実現できます。

上記の結果df は次のようになります。

複数列の抽出

複数の列を同時に取り出す事も出来ます。

この場合、データフレームの添え字に列名のリストを指定します。

df[ [列名1,列名2,・・・] ]

この場合に返される値は Sries 型ではなく データフレームとなります。

例えば、’col2’と ‘col3’ の列だけを抜き出したデータフレームを作りたい場合は次のようになります。

指定範囲の行の抽出

データフレームの添え字に列名を指定することで、その列を取り出すことが出来ましたが、列名ではなくスライサーを使うと特定の行範囲を取り出すことが出来ます。

df[行の開始位置:行の終了位置]

この時、取り出した内容はデータフレーム型になります。

つまり、既存のデータフレームから必要な行範囲を持つデータフレームを作り出したことになります。

Python 場合、スライサーの終了位置は、その行を含みませんので、1行目~3行目までが抽出されることになります。

条件指定による行の抽出

データフレームの添え字部分に条件式を書くことで、その条件に一致する行を抽出できます。

  df[df[列名] 比較演算子 値]  又は df.query(条件式)

例えば、’col2’の内容が22以下の行を抽出するには次のように記述します。  

query を使うと文字列として条件式を指定できるので、動的にデータを抽出したい場合に便利です。

また、queryの中は演算式も記述できるので、df.query(‘col2 * 2 <= 44’) という書き方もOKです。

DataTableでいうところの dt.Select(“条件式”) みたいなものですね。

df[df[‘col2’] <= 22]の補足ですが、df[‘col2′] は、’col2’ 列の内容を Series 型で取り出すという動作をします。

この時 <=22 という条件に一致する行は True、不一致の行は False が返されます。

この結果がdfの添え字に働くことで、結果的に条件に一致した行が取り出せるという仕組みです。

行または列の削除

行又は列を削除する場合は、 drop メソッドを使います。

この時、行を削除する場合は axis=0、列を削除する場合は axis=1 を指定します。

  行を削除  df.drop(列名,axis=0)  又は df.drop([列名1,列名2,・・・],axis=0)

  列を削除  df.drop(列名,axis=1)  又は df.drop([列名1,列名2,・・・],axis=1)

但し、元のデータフレームから列が削除されるのではなく、列が削除されたデータフレームが新たに作られることに注意して下さい。

もし、元のデータフレームから削除したいなら、次のように記述します。

まとめ

今回は基礎編ということで、

  • データフレームの作り方
  • 特定の要素(セル)へのアクセス方法
  • 列の取り出し方と更新方法
  • 行の取り出し方(スライサーとqueryメソッド)
  • 行または列の削除方法

について解説しました。

データフレームには数多くのメソッドが用意されており、今回紹介したのはほんお一部ですが、基本的な操作については一通り解説致しました。

次回は応用編ということで、もう少し細かい部分を掘り下げてみたいと思います。

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