pandasでSeriesを作成する方法について解説します。
Contents
Seriesの作成方法
pandasのSeriesはインデックスが付与された1次元の配列です。pandasのDataFrameと並んでpandasの中心的な型となっています。
NumPyのndarrayでもインデックスによるアクセスができますが、pandasのSeriesは、文字列インデックス等にも対応しており、Pythonの辞書のように扱うことができます。Seriesは以下のようなものと言い換えることができます。
- NumPyの配列(ndarray)を、文字列インデックス等にも対応できるように一般化したようなもの
- Pythonの辞書の特殊版のようなもの
NumPyの配列(ndarray)は、Pythonのlistに比べると大量データの処理が高速にできるという特徴がありました。同様にpandasのSeriesもPythonの辞書に比べると処理が高速という特徴があるため、Seriesについて知っておくことは価値がります。
以降では、Seriesデータの作成方法と要素へのアクセス方法について説明していきます。
リストまたはNumPy配列から作成する
pandasのSeriesは、PythonのリストやNumPy配列から作成することができます。以下で簡単な例を用いて見てみましょう。まずはPythonのリストから作成する例を見てみましょう。
import pandas as pd # リストからSeriesを作成する # int data = pd.Series([1, 5, 2, 4, 5]) print(data, '\n') # float data = pd.Series([1.0, 1.5, 2.0, 4.0, 5.0]) print(data)
【実行結果】 0 1 1 5 2 2 3 4 4 5 dtype: int64 0 1.0 1 1.5 2 2.0 3 4.0 4 5.0 dtype: float64
上記のようにSeriesでは、実行結果の左側がインデックス、右側が値となっています。また、dtypeは値の型を示します。
リストと同様にNumPyの配列(ndarray)からも以下のようにSeriesを作成することができます。
import numpy as np import pandas as pd # NumPy配列(ndarray)からSeriesを作成する # int arr = np.array([1, 5, 2, 4, 5]) data = pd.Series(arr) print(data, '\n') # float arr = np.array([1.0, 1.5, 2.0, 4.0, 5.0]) data = pd.Series(arr) print(data)
【実行結果】 0 1 1 5 2 2 3 4 4 5 dtype: int32 0 1.0 1 1.5 2 2.0 3 4.0 4 5.0 dtype: float64
気づいたかと思われますが、NumPy配列が作成されたときの型がint32であったので、作成されたpandasのSeriesもint32となっています。int64で作成したい場合は、以下のように書き換えることで対応することが可能です。
data = pd.Series(arr, dtype='int64')
任意のインデックスを指定して作成する
pandasのSeriesを作成するときには、以下のように任意のインデックスを指定して作成することができます。
import pandas as pd # リストからSeriesを作成する # 任意の数値を指定する data = pd.Series([1, 5, 2, 4, 5], index=[100, 300, 200, 500, 400]) print(data, '\n') # 文字列を指定することも可能 data = pd.Series([1, 5, 2, 4, 5], index=['a', 'c', 'd', 'e', 'z']) print(data)
【実行結果】 100 1 300 5 200 2 500 4 400 5 dtype: int64 a 1 c 5 d 2 e 4 z 5 dtype: int64
上記の例のように、数値を任意の順で指定したり、文字列を指定してSeriesを作成することが可能です。
辞書から作成する
pandasのSeriesは辞書の特殊版のようなものなので、Pythonの辞書から作成することができます。以下の簡単な例を用いて見てみましょう。
import pandas as pd # 辞書からSeriesを作成する dic = {'a': 10, 'z': 5, 'c': 20, 'f': 100} data = pd.Series(dic) print(data, '\n') # 辞書の中から一部だけを抽出してSeriesを作成する data = pd.Series(dic, index=['a', 'f', 'z']) print(data)
【実行結果】 a 10 z 5 c 20 f 100 dtype: int64 a 10 f 100 z 5 dtype: int64
Pythonの辞書からSeriesを作成する方法は簡単で、作成した辞書をSeriesの引数に渡してインスタンス化するだけです。
少し特徴的な作成方法として、以下の部分のようにindex引数で辞書の一部の特定インデックスの値だけ抽出してSeriesを作成する方法もあります。
# 辞書の中から一部だけを抽出してSeriesを作成する data = pd.Series(dic, index=['a', 'f', 'z'])
元データの一部だけを使ってSeriesを作りたいときに便利ですので覚えておくとよいでしょう。
SeriesからNumPy配列(ndarray)に変換する
リストやNumPy配列からpandasのSeriesを作成する方法を見てきましたが、逆にNumPyの配列(ndarray)に変換する方法を見ていきます。
import numpy as np import pandas as pd # NumPy ndarrayからSeriesへ変換する arr = np.array([1, 5, 2, 4, 5]) data = pd.Series(arr) print(data, '\n') # SeriesからNumPy ndarrayへ変換する arr_tmp = data.values print(arr_tmp, type(arr_tmp))
【実行結果】 0 1 1 5 2 2 3 4 4 5 dtype: int32 [1 5 2 4 5] <class 'numpy.ndarray'>
上記では、一度Seriesを作成した後にNumPyのndarrayへ変換しています。Seriesからndarrayを取得する方法は簡単で、Seriesのプロパティであるvaluesで取り出すだけでndarrayを取得できます。
NumPyとpandasの使い分け
NumPyとpandasで似たようなデータ構造がある場合、どちらを使うべきか悩むかもしれません。
大量データに対する色々な数値解析処理はNumPyのデータ構造で高速に動くように作られておりpandasよりも高速です。一方で、pandasのデータ構造はデータ操作がNumPyよりも容易にできるためデータ分析前の前処理に適しています。
pandasで前処理をして、NumPyでデータ分析というのが一つの使い方かと思います。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。