pandas

【pandas】Seriesの作成方法

【pandas】Seriesの作成方法

pandasでSeriesを作成する方法について解説します。

Seriesの作成方法

pandasのSeriesはインデックスが付与された1次元の配列です。pandasのDataFrameと並んでpandasの中心的な型となっています。

NumPyのndarrayでもインデックスによるアクセスができますが、pandasのSeriesは、文字列インデックス等にも対応しており、Pythonの辞書のように扱うことができます。Seriesは以下のようなものと言い換えることができます。

  1. NumPyの配列(ndarray)を文字列インデックス等にも対応できるように一般化したようなもの
  2. 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のSeriesint32となっています。int64で作成したい場合は、以下のように書き換えることで対応することが可能です。

data = pd.Series(arr, dtype="int64")

なお、NumPy配列のデータタイプは実行環境に依存するため、int32int64のどちらかになるかはお使いの環境に依存します。そのため、上記と同じ挙動にならない可能性がある点はご理解ください。

任意のインデックスを指定して作成する

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について知っておいて必要に応じて使用を選択するのが良いでしょう。