Python(基本的なこと005: pandasライブラリの簡単なサンプル)

■pandasのライブラリを試してみる。
前回numpyライブラリを動かしたので、今回それと同じくよく見かけるpandasのライブラリを試してみる。とりあえず公式ページの導入部を見ながら、いろいろと動かしてみた。pandasは、データセットを取り扱うのに適したライブラリで、主なオブジェクトとしてSeriesとDataFrameの2つがあった。まず、Series。下がサンプルコードと動かした結果。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)
print("==========================================")
s = pd.Series(5.0, index=["a", "b", "c", "d", "e"])
print(s)
print("==========================================")
print(s.head(2))
print("==========================================")

pandas_sample_code_result1

Seriesは1つの列のデータを扱うものらしく、pd.Series([...])で作成できた。データが欠けているところはNaNで補える。単純に表示すると、自動的に行番号も表示される。この行にあたるところはindexという形で呼ばれているようで、定義することもできた。次のコードでindexがa, b, c, d, eとなる5.0のSeriesを入力している。メソッドを試すために、上の行のみを表示するheadを試した(head(2)で上の2行分)。

次にDataFrame。Seriesが1列のデータに対して、こちらは複数列のデータを持つ。列にあたるところはcolumnと呼ばれているよう。下のコードでもindex, columnsで行と列の定義をしている。ここでは、Seriesをいくつか作り、そのデータを使ってDataFrameを作成している。はじめ、Seriesと同じように、pd.DataFrame([...], [...], [...])としてできないか試してみたけど、エラーが出た。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

a = pd.Series([1, 2, 3, 4])
b = pd.Series([5, 6, 7, 8])
c = pd.Series([9, 10, 11, 12])
d = pd.Series([13, 14, 15, 16])
e = pd.Series([17, 18, 19, 20])

#df = pd.DataFrame([1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19, 20])

sa = {"A": a,"B": b,"C": c,"D": d,"E": e}
df = pd.DataFrame(sa)

print(df)
print("===1: head (upper 2 lines)=======================================")
print(df.head(2))
print("===2: tail (lower 3 lines)=======================================")
print(df.tail(3))
print("===3: to_numpy (change to numpy)================================")
print(df.to_numpy())
print("===4: describe (basic statistics)===================================")
print(df.describe())
print("===5: A row=======================================")
print(df["A"])
print("===6: 4th line by index=======================================")
print(df[3:4])
print("===7: 4th line by index=======================================")
print(df.iloc[3])
print("===8: D row change to df size==================")
df.loc[0:4, "D"] = np.array([5] * len(df))
print(df)
print("==========================================")
df["F"] = df["A"] + df["B"]
print(df)

df.plot.scatter(x="A", y="E", alpha=0.5)
plt.show()

ts = pd.Series(np.random.randn(1000), index=pd.date_range("1/1/2000", periods=1000))
ts = ts.cumsum()
ts.plot()
plt.show()
# df.to_csv("foo.csv")

実行結果が下の画像。

pandas_sample_code_result2

Seriesの表示でもそうだったけど、pd.Series([1, 2, 3, 4])はDataFrameを表示するとき縦表示となる。今までリストや配列では、行のデータを下に追加していく感じなので列が追加されるのには少し違和感がある。

いくつかメソッドなども試してみた。1. headで上2行分を表示、2. tailで下3行分を表示、3. to_numpyでnumpyのオブジェクトに変換、4. describeで(多分)基本的な統計情報の表示、5. columnの指定で指定した列("A")の表示、6. indexの指定で指定した行(4行目)の表示、7. ilocで指定行を表示、8. locを使いながら、指令列を置き換え。ilocやlocの使い方はまだぴんとこないけど。

あと、A列とB列の和をF列として追加した。pandasはnumpyと違ってデータの追加ができるよう。

最後にpandasのグラフ表示のサンプルもあったので、実行してみた。
pandasの公式のDocumentationにのっていたサンプル(ts.plot();まで)をそのまま実行したら、グラフも、グラフのウインドウすら表示されない。ネットで調べてみて、表示するにはplt.show()(ここで、pltは「import matplotlib.pyplot as plt」)が必要らしい。仕様変更か何かあったのかな。
しかし、plt.show()は指定のDataFrameとの関連付けがないので、なんかわかりづらい。現在定義されているものを表示するだけといった機能なのかな。ちなみにpandasのバージョンは1.3.0。

pandasは、データをcsv, excel, SQLなどさまざまな形式に出力できるので、データをやり取りする中継点のようなイメージだった。