Ambivalent Wanderer

脳科学(認知科学)、ロボット、現代美術。興味があること、考えたことについて細々と書いています。

Python pandas 使えるようになってきたので覚え書き

こんにちは、Mikenerianです。


最近ようやくデータサイエンティストっぽい環境が整いつつあるので、覚えた技術についてまとめます。

というわけで第一弾は、Pythonにおけるデータ分析必須のライブラリ「pandas」についてです。
ちなみに第何弾まであるのかは決めておらず、そもそも第二弾をやるのかも不明です(汗)

どうでもいいですけどPython系って動物の名前多いですよね。Pythonはニシキヘビ、pandasはパンダ、anacondaはアナコンダ。かわいい。


ちなみにpandasを使う環境はjupyter notebookを強く推奨します。
jupyterは必ずどこかで触れたいと思いますが、jupyterを使えばいくつものデータをまとめて可視化、分析することができちゃいます。


ちなみに私のやり方は、研究などで実験データを上手く処理したい状況を想定しています。

方法別にまとめたので、必要なところ以外は読み飛ばすことをおすすめします。


f:id:Mikenerian:20181103235338j:plain:w600

ライブラリのインポート、使用するデータについて

今回はpandasメインですが、numpyとの相互変換についてもメモっておきます。

import pandas as pd
import numpy as np


今回使用するデータは、以下のようなものです。
f:id:Mikenerian:20181104000433p:plain:w400
このような調子で50人分のデータを、擬似乱数を用いて生成しました。
「条件」は1~3までがあり、前後は「0が前、1が後」という設定です。



データの読み込み

csv形式の場合、日本語が文字化けしてしまうという問題がありましたが、
なぜかxlsx形式を直接読み込むと解決しました。
ついでに.txt形式も試してみましたが、今度は区切りを認識してくれないという問題が発生します。

data = pd.read_csv('test_data.csv')
# または
data = pd.read_xlsx('test_data.xlsx')

Jupyter notebookでは、以下のように表示されます。
f:id:Mikenerian:20181104131543p:plain:w400


read_csvの引数

  • names = ('a', 'b'...)を設定すれば、列名(index)を指定できます。
  • ヘッダの無いデータの場合は、引数としてheader = Noneを設定します。
  • index列を変更するときは、index_col=n(nは任意の整数)として設定します。

データの除外

例えばNo.2のデータがミスだった場合、そこを丸ごと消したいという場合があります。

data = data.drop(1)    # データの行は0から始まることに注意

この処理後、データの行名から消した行が消える(番号が飛び飛びになる)ことに注意です。



データの抽出

# 「No.」と「条件」の列を抽出
a = data[['No.', '条件']]

ちなみにdata['No.', '条件']でも良いかと思われますが、そうするとデータ型が異なってしまい、次回以降同じ処理ができなくなるので注意が必要です。
もしデータ型が違ってしまった場合は、data.to_frame()により変換すれば戻ります。

# 「条件」が1であるデータの「No.」と「条件」の列を抽出
a2 = data.loc[:,['No.', '条件']]

#または
a2 = data[data['条件']==1][['No.', '条件']]

data.locは列名または行名を指定できるオプションです。
data.ilocを用いれば、列番号または行番号を指定できます。

# 0から10個の行を抽出
b = data[0:10]

データの追加

# 「結果4」という列を追加。値はスカラでも他のpandasでも。
data['結果4'] = 1

# 行の結合
data2 = pd.concat([data, data])

データ型の変換(pandas↔array)

# arrayへの変換
arr = np.array(data)

# pandasへの変換(列名などは再度指定する必要があることに注意)
pand = pd.DataFrame(arr)