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配列から作成することができます。以下で簡単な例を用いて見てみましょう。
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")
なお、NumPy配列のデータタイプは実行環境に依存するため、int32
と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 pandas as pd # Seriesを作成する data = pd.Series([1, 5, 2, 4, 5]) 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を使用して高速な数値計算を行うというのが一般的なワークフローとなります。
NumPyとpandasの機能の特性を理解して適切に使い分けることが重要です。
まとめ
pandasでSeries
を作成する方法について解説しました。
pandasのSeries
はインデックスが付与された1次元の配列です。pandasのDataFrame
と並んでpandasの中心的な型となっています。
pandasのSeriesは、Pythonの辞書のように扱えますが、辞書に比べると処理が高速という特徴があるため、Seriesについて知っておいて必要に応じて使用を選択するのが良いでしょう。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。