Pythonでのデータ解析の決定版とも言えるライブラリです。 特徴としては、
と言った感じです。
特に、可読性(コードの読みやすさ)の向上の恩恵はとても大きいものです。
NumPyでは、整数しかインデックスに使えませんが、Pandasでは文字列をキーとしてデータを操作できます。
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
Pandasの基本はSeriesとDataFrameですが、その内一列のデータ構造を表すSeriesをまず紹介します。
イメージとしては、Excelの縦に並んだ一列のデータを表すオブジェクトだと思ってもらうといいと思います。
# Seriesは配列を渡すとできる、内部ではndarrayを持っているのでdtypeがある
sr = pd.Series([1, 2, 3], index=["a", "b", "c"])
sr
# Series.valuesを見るといつでもndarrayに戻ってこれる
sr.values
# Seriesとの演算はSeriesが返ってくる
sr + 10
# インデックスを指定すると値を取り出せる
sr["a"]
# NumPyで言うファンシーインデックスが使える
sr[["a", "b"]]
# このように呼び出すこともできる
sr.a
# Seriesにnameとindexを付ける
sr = pd.Series(np.random.rand(8), name="random", index=list("abcdefgh"))
sr
# indexを明示的に与えない場合0, 1, 2,...と割り振られる
sr = pd.Series(np.random.rand(8))
sr
# 統計計算は当然持っている(合計、平均)
sr.sum(), sr.mean()
# プロット
sr.plot()
plt.xlabel("index")
plt.ylabel("value")
plt.show()
# Seriesに対しての演算はSeriesで返ってくる
sr < 0.5
# bool型のSeriesをインデックスにすることで、Trueのものだけを抜き出せる
sr[sr < 0.5]
# indexを日付などにすると時系列が表現できる
sr_time = pd.Series(np.random.randn(10), index=pd.date_range("2017/1/1","2017/1/10", tz="Asia/Tokyo"))
sr_time
# pandasには日付や期間を表すオブジェクトが充実している(これは1秒ごとのインデックスを作ったもの)
pd.date_range("2017/1/1/0:0", "2017/1/1/10:00", freq="S")
# スライスと同じ記法で日付の範囲を抜き出せる
sr_time["2017/1/5":]
sr_time.plot()
デフォルトだと、平均などは欠損値を覗いて計算されます。
データが汚い場合でも、データの整理に時間を取られず、本当にやりたい解析に集中することが出来ます。
# 3つ目に欠損値「None」、numpy.nanに変換され、dtypeはfloatとして扱える
sr = pd.Series([1.0, 0.7, None, 3.9, -0.4])
sr
# 平均は欠損値を除いて計算されている(大抵の場合、理想的な処理)
sr.mean()
# NaNを0で埋める処理
sr.fillna(0.)