今回はPythonの主要なライブラリ群の一つ「pandas」のデータ構造について学んでいく。
pandasはデータの整理や分析を簡単に行うためのツールを持っており、NumPyなどの数値計算ツールと連携して使われることの多いライブラリだ。
NumPyとの大きな違いは、pandasはテーブル形式のデータを扱うことに適しており、高度なデータ構造を持っているという点だ。
まずはそのデータ構造のうち、シリーズ(Series)について詳しくまとめていく。
コンテンツ
ライブラリのインポート
まずはシリーズを扱うまえに、pandasをインポートする必要がある。
1 | import pandas as pd |
次にSeriesをインポートする。
1 | from pandas import Series |
これで準備完了だ。
シリーズ(Series)とは
pandasのシリーズは一次元配列のようなオブジェクトで、インデックスとそれに該当する値を持つ構成となっている。
01 02 03 04 05 06 07 08 09 10 11 12 | import pandas as pd from pandas import Series obj = pd.Series([ 5 , 6 , 7 , 8 ]) obj # 0 5 # 1 6 # 2 7 # 3 8 # dtype: int64 obj[ 2 ] # 7 |
values属性とindex属性
シリーズにはvalues属性と、index属性が用意されており、それぞれシリーズが持つデータ配列とインデックスオブジェクトを取得することができる。
01 02 03 04 05 06 07 08 09 10 | import pandas as pd from pandas import Series obj = pd.Series([ 5 , 6 , 7 , 8 ]) obj.values # array([5, 6, 7, 8]) obj.index # RangeIndex(start=0, stop=4, step=1) |
インデックスにラベルを付けて分かりやすく管理する
また、Pythonのディクショナリのように、インデックスには任意のラベルを付けて管理することも可能だ。
01 02 03 04 05 06 07 08 09 10 | import pandas as pd from pandas import Series obj = pd.Series([ 5 , 6 , 7 , 8 ], index = [ 'a' , 'b' , 'c' , 'd' ]) obj # a 5 # b 6 # c 7 # d 8 # dtype: int64 |
NumPy的な操作をシリーズに適用する
NumPyの配列ndarrayで扱った、条件指定によるフィルタリングや関数の適用などをおこなった場合でも、インデックスとデータの関連はそのまま保持される。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | import pandas as pd from pandas import Series obj = pd.Series([ 5 , 6 , 7 , 8 ], index = [ 'a' , 'b' , 'c' , 'd' ]) obj[obj > 6 ] # c 7 # d 8 # dtype: int64 np.exp(obj) # a 148.413159 # b 403.428793 # c 1096.633158 # d 2980.957987 # dtype: float64 |
ディクショナリをシリーズに変換する
Python標準のディクショナリを元に、シリーズを作成することもできる。
01 02 03 04 05 06 07 08 09 10 11 | import pandas as pd from pandas import Series data = { 'taro' : 100 , 'jiro' : 85 , 'saburo' : 90 } obj = pd.Series(data) obj # taro 100 # jiro 85 # saburo 90 # dtype: int64 |
シリーズのname属性
シリーズのオブジェクト自身と、インデックスはそれぞれname属性を持つ。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | import pandas as pd from pandas import Series data = { 'taro' : 100 , 'jiro' : 85 , 'saburo' : 90 } obj = pd.Series(data) obj.name = 'Object Name' obj.index.name = 'Index Name' obj # Index Name # taro 100 # jiro 85 # saburo 90 # Name: Object Name, dtype: int64 |
シリーズオブジェクトのname属性は、データベースで言うところのテーブル名に該当し、インデックスのname属性は、さしずめカラム名といったところだろうか。
まとめ
pandasではデータ構造として、シリーズとデータフレームを持っているが、今回は一次元配列を扱うシリーズを詳しく取り上げた。
次回は、データベースに構造が近いデータフレームについて紹介する。