Python3 – KMeansClustering

概要

k平均法(k-means clustering)はクラスタリングの手法の1つで、与えられたデータ群の特徴と初期値に基づいて、データを並列(非階層)のクラスターに分類する。

アルゴリズムはシンプルで、以下の手順。

  1. クラスターの数だけクラスターの代表点の初期値を設定する
  2. 代表点の位置が収束するまで以下を繰り返す
    1. データの各点から最も近い代表点を選ぶ
    2. 同じ代表点の点群から重心を算出し、新しい代表点の位置とする

このクラスは、特徴量が2つのデータ群と代表点の初期値を与えて、k平均法でクラスタリングを行うテストクラス。

2つの特徴量x_datay_dataを与えてオブジェクトを生成し、代表点の初期値x_meansy_meansを与えてメソッドを実行して結果を得る。

全コード

KMeansClusteringクラスの全コードは以下の通り。

利用方法

クラスタリングを行うインスタンスの生成

初期データを与え、KMeansClusteringクラスのインスタンスを生成する。

コンストラクターに与える引数は以下の通り。

x_data, y_data
クラスタリングを行うデータの特徴量x、yの配列(1次元のndarray)。

クラスタリングの実行

生成したインスタンスに対して、クラスタリングを行うメソッドを実行して結果を得る。

メソッドに与える引数は以下の通り。

x_means, y_means
k個のクラスターの代表点の初期値(1次元のndarray)。

結果は以下のタプルで与えられる。

x_means, y_means
クラスターの代表点のx、yの配列。収束までの各計算段階の値を記録しており、2次元のndarrayの各行が各計算ステップに相当。
groups
各データが属するクラスター(代表点)番号のndarray

実行例

以下のコードでKMeansClusteringクラスをテスト。内容は以下の通り。

  1. 2つの円状に散らばるランダムな点群を発生させ、1つのデータとしてまとめる
    • random_scatter_dataは指定した中心・半径の円内に指定した数のランダムな点を発生させるモジュールで、別途作成(最後の方にコードを掲載)
  2. クラスターの代表点の数と位置、散布図を描画するパラメーターを設定する
    • プロットする図の数は2行3列で固定し、初期状態を除いた5つの図を表示させる
    • 予め実行させてコンソールで収束回数を確認し、33行目で表示させる計算ステップを指定している
  3. 初期状態の散布図をプロット
  4. クラスタリングを行うKMeansClustringオブジェクトを生成し、結果を得るためのメソッドを実行(53-54行目)
  5. 結果をプロット

このコードの実行結果はコンソールで以下のように表示される。

この結果から1、2、3、5、7回目の計算結果を図示するよう上のコードでセットした表示結果は以下の通り。

グループが比較的明確なので、早い段階で代表点の位置が定まっている。

クラス説明

__init__()~インスタンス生成

クラスタリングを行うデータの特徴量x_datay_datandarrayで与えてインスタンスを生成。

プライベート・メンバーは以下の通り。

_x, _y
クラスタリングを行うデータの2つの特徴量の配列。計算過程で変更されない。
_x_means, _y_means
代表点の計算結果を保存していく配列。分析実行時に初期値が与えられるため、初期値はNone。
_num_data
データの個数。
_num_means
代表点(クラスターの個数)。代表点が分析実行時に与えられるため、初期値は0。
_groups
各データの属するクラスターを保存していく配列。

get_result()~分析の実行

k個の代表点のx、yを引数として渡し、結果を得る。

引数

_x_means, _y_means
k個の代表点の初期値x、yを、それぞれ1次元のndarrayで与える。引数で与えた配列は変更されない。

戻り値

x_means, y_means
代表点の計算結果が保存された配列。各行は計算ステップに相当。
groups
各計算ステップにおける、各点のクラスターが保存された配列。各行は計算ステップに相当。

処理内容

  1. 代表点の初期値をプライベート・メンバーにコピーし、代表点の個数をセット
  2. 全ての代表点の位置が収束するまで、以下を繰り返す
    1. 各データについて、最も近い代表点をセット
    2. 共通の代表点を持つデータから、新しい代表点の位置を計算
    3. 代表点の前回最後の計算値と今回の計算値が収束したならループ終了、でなければ計算結果を追加してループ継続
  3. 計算結果を戻り値として終了

プライベートメソッド

_distance()~2点間の距離

2つの点の距離を与える。ここではユークリッド距離の2乗。

_point_converged()~収束判定

2つの点の座標から、点の位置が収束したかどうかを判定。

本来、各座標値はfloatなので'=='による判定は危険だが、ここでは収束の速さと確実性を信じて簡易に設定。

_all_points_converged()~全ての点の収束判定

配列で与えた2組の点がすべて収束条件を満たしているか判定。

_set_nearest_mean_point()~各点に最も近い代表点

処理内容

  1. 各データについて、それぞれから最も近い距離にある代表点を探し、その番号を1次元の配列groupsに記録
  2. _groups配列に、今回の分類結果を行として追加

_revise_mean_points()~代表点の更新

同じ代表点に属するデータからそれらの重心を計算し、新しい代表点として返す。

random_scatter_data.py

今回整理のためにつくったモジュールで、内容は以下の通り。

 

Python3 – 2次元配列への行・列の追加

概要

2次元配列をデータテーブルのように使っていて、行や列を追加する場合の方法を整理。

リストの場合とndarrayの場合それぞれについて、行の追加、列の追加のためのメソッドや関数と、その使い方の注意を記しておく。

結論として、ndarrayを使う場合はnumpy.vstack()関数、numpy.hstack()関数を用いるのが、配列の2次元化や追加方向のaxis指定がなく紛れがない。

リストの場合

リストの場合はappend()メソッド、insert()メソッドで行や列を追加する。ただし、より現実的な方法をこちらに整理した。

注意点

  • リストのappend()メソッド、insert()メソッドは元のリストを書き換える
  • 各メソッドは戻り値を持たない(None)
  • 初期データが1行/1列の場合に2次元配列であることを明示する必要がある

初期リストが空の場合は単に1次元の空のリストを準備すればいいので、初期リストがある場合でも、空のリストを準備してからそこに追加するように決めておけばミスは減りそう。

行の追加

append()メソッド

append()メソッドは素直に引数のリストをもとのリストに追加する。ただし、下のコードの1行目のように元のリストが2次元配列であることを明示しなければならない。

以下は失敗。元のリストを単なる要素リストで定義してしまうと、追加するリストが要素の一つとして扱われてしまう。

空のリストへの追加。

この場合は1次元の空のリストを用意すれば、追加されるリストが要素として順次追加されていく。

insert()メソッド

insert()メソッドも素直にリストを追加してくれるが、追加位置を指定するのに一手間かかる。行の最後に追加するときは、追加位置をlen(元のリスト)で指定する

その他の仕様はappend()メソッドと同じ。

空のリストへの追加もappend()メソッドと同様。

列の追加

列の追加の場合、各要素が縦に並んだ列ベクトルとしての定義になる。

append()メソッド

行の追加と同様。最初の1列から定義する場合、明示的に列ベクトルの2次元配列であることを明示する必要がある。

空のリストへの追加の場合は、行の追加と同様シンプル。

insert()メソッド

insert()メソッドの場合も行の追加と同様。

空のリストへの追加も行の追加と同様。

ndarrayの場合

ndarrayの場合は、numpyのモジュール関数append()insert()のほか、hstack()関数、vstack()関数も使える。

注意点

  • リストのメソッドと異なり、numpyの各モジュール関数は元の配列を変更せず、変更後の新たな配列を戻り値として返す
  • append()関数、insert()関数では、行の追加/列の追加に応じて引数axisを指定する
  • append()関数は、行を追加する場合は追加する配列も2次元で明示する必要があるが、列を追加する場合にはそのまま指定する
  • 空の配列はempty()関数で準備し、型を指定しておく
  • hstack()関数、vstack()関数は、元の配列と追加する配列をタプルで指定する

行の追加

ndarrayで行を追加する場合、numpyモジュールのappend()関数、insert()関数でaxis=0を指定するか、vstack()関数を利用する。

numpy.append()関数

初期配列が2次元であることを明示しなければならない点はリストのappend()メソッドと同じだが、追加配列でもこれが必要になる。

numpy.append(元の配列, 追加する配列, axis=0)

  • 追加する配列は、元の配列と次元・列数があっていなければならない
    →行ベクトルでもndarrayの2次元配列としなければならない
    →下記コード例では4行目のnp.array([b])
    →こうしないと”次元が合わない”としてエラーになる
  • 追加する配列を行として追加する場合は、axis=0の指定が必須(これを指定しないと、単に元の要素に続いて追加配列の要素が追加されるだけ)

空の配列への追加の場合、numpy.empty(0, n)で空の配列を準備する。

numpy.empty((行数, 列数), dtype=型)

  • 確保する配列の各次元のサイズはタプルで指定
  • 行が空なので行数は0で指定
  • dtype引数で型を明示しないとデフォルトのfloat型になる

numpy.insert()関数

リストのinsert()メソッドと同様だが、いくつか注意が必要。

numpy.insert(元の配列, 追加する行位置, 追加する配列, axis=0)

  • 追加する位置は最後の行の次の行番号で、これは元の配列のshapeプロパティーで得られる(shape[0]は配列各次元のサイズで、2次元配列の場合shape[0]は行数、shape[1]は列数を表す)
  • 追加する配列はそのまま指定する(2次元で定義しない)
    →追加する配列は2次元化しても同じ結果になる
  • axis=0の指定が必要

空の配列への追加する場合は、元の配列をnumpy.empty(0, n)で生成。

numpy.vstack()関数

numpy.vstack()関数は引数に2以上の配列を指定し、それらを縦に連結していく。特に2次元配列化や軸の指定の必要はない。

空の配列への追加の場合は、numpy.empty(0, n)で生成した空の配列を含めて、順次タプルの中に追加したい配列を指定するだけでよい。

列の追加

ndarrayを列として追加していく場合、追加する配列も列形式である必要がある。列方向の追加をaxis引数で指定する必要がある。

  • 通常の行形式の1次元配列を列として追加する場合、reshape(列数, 1)で列ベクトル化する
  • 追加するベクトルを[]で囲って2次元化する必要はない
  • axisi=1で列方向の追加として指定

numpy.append()関数

行の追加の時と違って、元の配列も追加する配列も2次元化しない。

空の配列への追加は、列数をゼロとしてnumpy.empty(n, 0)で指定する。

numpy.insert()関数

numpy.insert()関数も行の追加と同じだが、以下の点に注意。

  • 列の追加位置(最後の列の次)は元の変数のshapeプロパティーの2つ目shape[1]で指定する
  • 追加する配列は2次元化せずそのまま指定
  • 列方向の追加なのでaxis=1を指定する

空の配列への追加はこれまでと同様。

numpy.hstack()関数

numpy.hstack()関数はvstack()と同様、引数に2以上の配列を指定し、それらを横に連結していく。1次元配列はreshape(-1, 1)などで列ベクトル化する必要がある。

空の配列への追加の場合は、numpy.empty(n, 0)で生成した空の配列から始めて、順次タプルの中に追加したい配列を指定するだけでよい。

 

Python3 – 2次元配列からの要素の取り出し

概要

リスト、ndarrayの2次元配列について、いろいろな要素の取り出し方を整理する。

リストについては、以下の配列を準備する。

ndarrayについては、以下の配列を準備する。

各要素の10の位が行を、1の位が列を表している。

特定要素の取り出し

リストの場合は[行番号][列番号]で取り出す。

ndarrayの場合もリストと同じ。

ただしndarrayにはもう一つの方法があって、[行番号, 列番号]でも指定できる。

行の取り出し

リストの場合[行番号]で該当する行を取り出せる。

スライスを使って複数行を取り出すこともできる。

ndarrayの場合もリストと同じ。

スライスの場合も同じ。

ndarray用の指定の場合、列番号を省略。

行をスライス指定する場合。

列の取り出し

ndarrayでの列の取り出し方は以下の通り。ただし、取り出された列は行方向の配列に変更される点に注意。

スライスを使って複数列を取り出せる。

スライスを使うと、単一の列を列ベクトルとして取り出せる。

reshape()で行ベクトルを列ベクトルに変換してもよい。

 

なお、リスト、ndarrayとも、以下の指定方法では意図した列の抽出にならず、行の抽出になってしまう。

内包表記による列指定

リスト、ndarrayとも、内包表記を使って列を取り出せる。ただし結果は行ベクトルとなる。

複数列の取り出しは以下の通り。

リストの場合、表現が少し違うが、[行番号][列番号]で要素が取り出せる。

 

ndarray – 要素・行・列の挿入・追加

1次元配列

要素の挿入

ndarrayの1次元配列への要素の挿入にはnumpy.insert()関数を使う。第1引数に対象となる配列、第2引数に挿入位置、第3引数に挿入する値を指定。

指定された位置に値が挿入され、それ以降の要素は一つずつ後ろにずれる。

要素の追加

配列の最後に要素を追加するには、以下の方法がある。

  • numpy.append()
  • numpy.insert()
  • numpy.hstack()

numpy.append()

第1引数に配列、第2に引数に追加する要素を指定。メソッドではなく、モジュール関数。1次元配列に1次元配列を追加すると、単に要素が追加される。

numpy.insert()

挿入位置として最後の要素の次の位置を指定する。この値は配列のサイズと等しい。

numpy.hstack()

注意点として、引数として指定するのはタプルで、そのタプルの要素をつなげた結果が返される点で、追加される要素を配列としなければならない。

2次元配列

numpy.insert()で単純に位置指定だけすると、1次元配列として扱われてしまう。

行の挿入・追加

1次元配列を行として挿入するには、numpy.insert()で第4引数にaxis=0を指定する。

配列の最後に行を追加するには、numpy.insert()で最終行の次の位置=行数を指定する。

shapeプロパティーで各次元のサイズの配列が得られるので、行数として第0要素の値を使う。

numpy.vstack()を使ってもよい。vstack()は複数の配列を縦方向につなげていく関数で、つなげる関数群を要素とするタプルを引数とする点に注意。

列の挿入・追加

numpy.insert()で列を挿入する場合、axis=1を指定する。列の追加の場合でも、追加する配列は行形式の1次元配列で指定。

numpy.insert()で配列に列を追加する場合、指定位置はshapeの第1要素の値。

numpy.hstack()を使ってもよい。hstack()の注意点は以下の通り。

  • 引数をタプルとすること
  • 追加する配列は列形式とする必要があり、1次元の配列を列形式に変換すること

 

Python3 – リストの要素・行・列の抽出

概要

リストのスライスについてまとめる。リスト要素にアクセスするために[]で要素を指定する、その方法。

1次元

要素の指定方法

まず標準的な方法。

[開始値]:[終了値]を指定して、複数の要素をリストとして取り出せる。開始値・終了値のいずれかを省略すると、それぞれ先頭・最後尾に対応し、両方とも省略すると”全ての要素”を意味する。

Pythonのリストでは、要素位置は0から始まり、”終了値”は”その1つ手前の要素まで”を意味する。

特に開始値と終了値を省略した[:]の表記は、すべての要素を示す。

[開始値]<[終了値]でなければならない(終了値が最終要素の位置+1 であることに注意)。この条件に満たないときは、エラーにならず空のリストが返される。

終端からの指定

要素位置を負の数で指定した場合、最後尾の要素からの位置指定になる。-1は最後尾の要素の位置で、-2、‐3はその1つ前、2つ前の要素。

要素位置を負数で指定する場合も、[開始値]<[終了値]というルールは同じ。

先頭要素、最後尾要素の指定

1次元のリストの先頭要素、最後尾要素の指定方法は以下の通り。

2次元

シンプルな2次元配列のリストの場合。

行の抽出

第1引数だけを指定すると、2次元配列の場合は指定した行を抽出。スライスで指定した場合は対応する行が抽出される。

特定の行のスライスは以下のように指定。

列の抽出

第1引数で行のスライスを指定したうえで列方向の要素を取り出そうとi意図して、以下のように指定するとエラー。

さらに第1引数を[:][n]のように指定すると、n行目が取り出されてしまう。

リストの内包表記で、取り出す行を変数にするとうまくいく。

 

Python3 – リストのコピー

変数の代入

リストなどのミュータブルオブジェクトのコピーには注意を要する。

単に変数を代入した場合、元のオブジェクトへの変更は同じ参照の全ての変数に影響する。

copy()関数・copy()メソッド

copyモジュールのcopy()関数を使うと、リストの各要素のインスタンスが新たに生成され、その内容がコピーされる。このため、コピー元への変更の影響はない。

deepcopy()関数による完全な複製

2次元配列など、ミュータブルオブジェクトの要素がミュータブルな場合は、copy()だけでは各要素への参照が変わらないため、下位の要素の変更が波及する。このような上位要素のみに対するコピーをシャローコピーと呼ぶ。

ミュータブルオブジェクトを要素に持つミュータブルオブジェクトの完全な複製を得るには、copy.deepcopy()関数を使う。

リストのコピーの別方法

copy()関数はcopyモジュールをインポートする必要があるが、以下の方法はcopyモジュールがなくても同じ結果が得られる。

copy()メソッド

リストのcopy()メソッドは、copy.copy()関数と同じく各要素の複製を生成する。

[:]

リストのスライスは元のリストの要素を生成し、新たなリストを返す。スライスを全要素[:]とすることで、元のリストの複製が得られる。

ただし、copy()メソッドもスライスによる方法もシャローコピーなので、多次元配列などのディープコピーはできない。

 

matplotlib.pyplot – グラフ

グラフの描画

pyplot

figure, axes

グラフの種類

3次元グラフ

tips

 

matplotlib.pyplot – 基本的なグラフの描画方法

概要

pyplotのみを使った基本的なグラフの描画方法。一般的にはmatplotlib.pyplotpltというエイリアスでインポートする。

この例では、pyplotの関数のみを用いて1つのグラフに2つの曲線を描画し、タイトルや軸ラベル、凡例などを追加している。

また、軸目盛の間隔を設定したり、グリッドを描かせたりしている。

実行結果は以下の通り。

ライブラリーのインポート

グラフ描画のためのパッケージ、matplotlob.pyplotpltとしてインポートしている。また、関数描画のためにnumpynpとしてインポート。

描画する関数

ここではpyplotplot()で描画するため、2つの三角関数を準備している。

xの値は共通で、numpy.linspace()で−π~+πの間で等間隔にデフォルトの50個の点を準備。endpoint=Trueで終端の点も含めている。

そのxの値に対して、sin、cosの関数の値をy1y2に保存。numpy.linspace()から得られるxや、それに対してNumpyのユニバーサル関数で計算されるy1y2ndarray

各種設定

タイトルと軸ラベル

pyplot.title()の引数でグラフのタイトル、pyplot.xlabel()pyplot.ylabel()の引数でx軸とy軸のラベルを設定している。

軸の範囲

pyplot.xlim()pyplot.ylim()で、それぞれの軸の下限値と上限値を設定している。x軸については−π~+πとしている。

軸目盛

pyplot.xticks()pyplot.yticks()の引数で、軸目盛に表示する値を設定している。引数は、表示させたい軸の値をリストとして与える。

x軸については−π、−π/2、0、π/2、πの値を直接与え、y軸についてはnumpy.linspace()関数で、-1~+1の間で等間隔な5点(-1、-0.5、0、0.5、1)を計算している。

グリッド(補助線)

グラフの描画エリア内に、軸目盛に対応した細い補助線を描くため、pyplot.grid()の引数をTrueで指定している。

グラフの描画

pyplot.plot()の引数にxy1及びy2を指定してグラフを描いている。2つのplot()関数を書くことで、関数は重なって描かれる。

それぞれのグラフに対してlabel引数を指定していて、それらは凡例表示に使われる。

凡例の表示

pyplot.legend()で凡例を設定している。

凡例にはpyplot.plot()で指定したラベルが使われるため、pyplot.legend()pyplot.plot()の後に書かなければならない。

また、凡例の表示位置をloc引数で指定していて、この場合は左上に凡例が表示される。凡例の位置は、upper/lowerleft/rightをスペースで繋いだ文字列で指定。

グラフの表示

pyplot.show()でグラフを表示させている。

 

Python3 – pandas

概要

pandasはPythonのライブラリで、Rのdata frameのようなデータフレームをDataFrameクラスとして提供している。

その由来はpanel-data-sらしいが、公式ドキュメントにはそういう記述は見当たらない。

DataFrame

 

pandas.DataFrame

情報・内容の取得

データの概観

基本的なパラメーターの取得

DataFrameの生成

要素の操作

列の操作

行の操作

DataFrameで直接行を指定して参照

DataFrameで直接行番号を指定する場合はスライスで指定する。1行取り出す場合でもdf[col:col+1]のようにスライスにしなければならない。

maskによる行の抽出

DataFrameの特定列に対する条件式は、その条件に応じたTrue/Falseを要素とするSeriesオブジェクトを返す。

そのSeriesオブジェクトをDataFrameの引数とすると、Trueに対応する行だけが抽出される。

これをまとめて次のようにも書ける。

抽出結果の特定の列を参照可能。結果はSeriesオブジェクト。

queryによる行の抽出

DataFrameのquery()メソッドでも行を抽出できる。

抽出結果から特定の列を参照可能。結果はSeriesオブジェクト。

行の追加

1行追加する場合

1行追加する場合、locで新たな行インデックスを指定して内容を与える。

複数行追加する場合

複数行(=配列)を追加する場合、その配列をDataFrameオブジェクトとしてからappend()メソッドを使う。ただし単純に追加すると、新たな行・列として拡張されてしまう。

これを回避するためには、追加する行の列名をcolumnsで明示する。ただしこの段階では、追加された行のインデックスが連続していない。

インデックスを連続させるためには、ignore_index=Trueを指定する。

DataFrameの結合

cocatメソッド~縦方向の結合

concat()メソッドは複数のDataFrameを縦に結合した結果を返す。列の構成が同じDataFrameオブジェクトをリスト化して与える。

列数が異なるDataFrameを結合すると、余った要素にはNaNがセットされる。

joinメソッド~横方向の結合

join()メソッドは元のDataFrameに引数のDataFrameを結合した結果を返す。結合は行のインデックスに着目して実行され、インデックスが同じデータは同じ行の列方向に追加される。すなわち、同じ行数で異なる列のDataFrameを結合するのに適している。

破壊的な処理ではなく、元のDataFrameはそのままで新しいDataFrameが生成される。

この例では2つのDataFrameの行が一致しており、列が異なるので、横方向に結合されている。同じ列名が存在する場合はValueErrorとなる。

3つ以上のDataFrameを結合したい場合(引数に2つ以上のDataFrameを指定したい場合)は、それら複数のDataFrameをタプルかリストでまとめて指定する。

合計の計算と合計欄

以下の配列を使う。

sum()メソッドはSeriesオブジェクトを返す。

合計欄としてDataFrameに追加する場合、行/列いずれかの合計を計算して追加し、その上で他方の合計を計算して追加すると、総計まで計算できる。

行の追加はlocプロパティーを通じて、列の追加は列名を指定して行う。

より詳しい合計や率の算出方法はこちら

ソート

 

以下のデータを使用

sort_values()~列名を指定してソート

デフォルトは昇順。元のオブジェクトは変更されず、ソート後のDataFrameオブジェクトが生成されて返される。

ascendingパラメーター

ascending=Falseを指定すると降順でソート。

reset_index()~インデックスの降り直し

ソート後にインデックスを振りなおす場合、reset_index()メソッドを使う。このメソッドも元のオブジェクトを変更しない。

降りなおした後のインデックスで元のインデックスを上書きする場合は、drop=Trueを指定。

複数列によるソート

複数列を指定してソートする場合、ソートの優先順にリストで指定。ascendingパラメーターに同じ要素数のTrue/Falseリストを与えて、列ごとの昇順/降順を指定可能。

axisの方向

各種演算・処理の引数でaxisを設定するときの、行方向・列方向がまぎらわしいので整理。

DataFrameの設定

列のインデックス設定

set_index()メソッドにより、第1引数keysで指定した列をインデックスに設定される。

表示行数・列数の設定

表示行数・列数の省略

行数・列数が多いDataFrameを表示させると、途中を省略して表示する。デフォルトで行数は60行を超えると省略され、列数は画面幅に応じて調整される。以下のコードは、pandasのオプションでdisplay.max_rowsdisplay.max_columnsも表示させている。

この場合、行数に61行をしているので行表示は省略され、列数はコンソールの幅に応じて省略されている(コンソールの幅を変えて実行すると、その幅に応じて納めようと省略される)。

表示行数の設定

表示させる最大行数を変更するには、pandas.set_option()display.max_rows属性を設定する。

表示列数の設定

表示させる最大列数を設定するには、pandas.set_option()display.max_columns属性を設定する。以下の例では20列すべてを表示させていて、コンソールの幅に収まらない列は表単位で改行されている。

ファイルの読み込み

CSVファイル

DataFrameにCSVファイルの読み込みには、pandas.read_csv()を使う。

pandas.read_csv(path)
pathは読み込むCSVのパス

ヘッダー付きCSVファイル

たとえば、以下のようなヘッダー付きのCSVファイル(ex_basic_w_header.csv)を考える。

このファイルが実行ファイルと同じディレクトリにある場合、以下のように__file__を使って読み込むとよい

データには自動的にインデックス番号が付加される。

ヘッダー無しCSVファイル

以下のようなヘッダーがないファイルの場合。

そのまま読み込んでしまうと1行目がヘッダーと解釈されてしまう。

引数にheader=Noneを指定すると1行目からデータとして読み込み、列名には番号が振られる。

引数としてnames=(列名1, 列名2, ...)を指定すると、ヘッダー無しとして読み込まれ、列名がセットされる。

行のスキップ

以下のように、先頭から何行か読み飛ばしたいファイルの時。

引数にskiprowsでスキップする行数を指定する。このとき、最初の行はヘッダーとして解釈される。

ヘッダー行の指定

ヘッダー行を含むファイルでヘッダーの開始行を指定したいときはheaderで開始位置を指定する。指定したヘッダーより前の行は無視される。

インデックス列の指定

以下のファイルは通し番号付きで、番号には列名がない(1行目の1列目が空)。

これをそのままデータフレームに読み込むと、1列目もデータと解釈されてインデックスが自動生成される。

引数にindex_col=0を指定すると、その列がインデックスとして認識される。

index_colを1以上の値にすると、それ以前の列は読み込まれない。ただし指定した列に列名が定義されていると、それもデータとみなされてしまう。

日本語

日本語などマルチバイトの文字を含む場合、対応する文字コードを指定する。

One-hot-encoding

DataFrameのget_dummies()メソッドは、属性データをone-hotの形にエンコードしてくれる。

Tips – 注意点など

配列で生成しない方がいい

コード上で簡単なDataFrameを生成するとき、配列で数値と文字列を混在させるとトラブルになる

DataFrameの行追加の速さ

DataFrameに行を追加する場合、基本的にはリストに変換してリストの状態で行を追加し、それをDataFrameに変換するのが最も速い。いくつかの方法による速さの違いはこちら

行単位/列単位の合計・率の計算

DataFrameオブジェクトの行単位/列単位の合計や、それらを使った率の計算方法