【Pandas】Seriesの特徴と作成方法を解説

PandasではDataFrameだけでなく、Seriesというデータ構造も存在します。DataFrameとSeriesは相互に関連した構造ですが、それぞれ異なる特徴を持ち合わせています。

今回はSeriesの特徴とその作成方法について紹介します。

Seriesとは

Pandas公式によると、Seriesとは1次元のラベル付きndarrayです。

One-dimensional ndarray with axis labels (including time series).

https://pandas.pydata.org/docs/reference/api/pandas.Series.html

つまりSeriesのベースはndarray(配列)でそれぞれの要素にラベル(インデックス)を持った構造ということになります。

以下に簡単なSeriesの例を示します。

import pandas as pd

d = {'a': 1, 'b': 2, 'c': 3}
ser = pd.Series(data=d, index=['a', 'b', 'c'])
ser

>>a   1
  b   2
  c   3

このとき1~3が配列の要素、a~cがラベル(インデックス)です。ラベルには数値やキーワード、時間を割り当てることができます。

DataFrameの1列分をインデックスとともに取り出した構造がSeriesです。逆に、Seriesを複数まとめるとDataFrameになります(後述します)。

Seriesの作り方

Seriesはいくつかの方法で作成することができます。以下で順に見ていきます。Seriesはpd.Series()で作成します。

配列から作成

まずはオーソドックスな方法として配列からSeriesを作成してみます。特に指定しない場合、インデックスには0からの連番が割り当てられます。

import pandas as pd

data = [1,2,3,4,5]
Series1 = pd.DataFrame(data)
Series1

>>0    1
  1    2
  2    3
  3    4
  4    5

当然ながら、Numpy配列から作成することもできます。

import numpy as np

data = np.array([1,2,3,4,5])
Series2 = pd.DataFrame(data)
Series2

>>0    1
  1    2
  2    3
  3    4
  4    5

値を文字列にしても作れます。

data = ["リンゴ","ゴリラ","ラッパ","パンダ"]
Series3 = pd.DataFrame(data)
Series3

>>0    リンゴ
  1    ゴリラ
  2    ラッパ
  3    パンダ

さらに、いろいろなデータ型が混じっていても作成可能です。

data = ["リンゴ",1,True,"パンダ"]
Series4 = pd.DataFrame(data)
Series4

>>0     リンゴ
  1       1
  2    True
  3     パンダ

ただし、こういうデータの持ち方は本当にオススメしません。このデータを処理する際に非常に扱いづらく、エラーの温床となる可能性が高いためです。

配列もそうですが、Seriesでは1つのデータ型で値を保持するようにしておきましょう。

辞書から作成

冒頭の例にもありますが、辞書からSeriesを作成することもできます。辞書から作成した場合、インデックスは辞書のキーになります。

data = {"リンゴ":1, "ゴリラ":2, "ラッパ":3, "パンダ":4}
Series5 = pd.Series(data)
Series5

>>リンゴ    1
  ゴリラ    2
  ラッパ    3
  パンダ    4

インデックス

特に何も指定せずにSeriesを作成した場合、インデックスには0からの連番が割り振られます。また、辞書からSeriesを作成した場合、キーがインデックスになります。

インデックスはSeries作成時に指定することもできますし、後から指定することもできます。インデックスを指定する場合、値の要素数と一致していないとエラーになります。

作成時に指定する場合、引数indexに指定します。

data = [1,2,3,4,5]
index = [10,11,12,13,14]
Series = pd.Series(data,index=index)
Series

>>10    1
  11    2
  12    3
  13    4
  14    5

後から指定する場合は、Series.indexを書き換えます。

data = [1,2,3,4,5]
Series = pd.Series(data)
Series

>>0    1
  1    2
  2    3
  3    4
  4    5

#インデックス更新
index = [10,11,12,13,14]
Series.index = index
Series

>>10    1
  11    2
  12    3
  13    4
  14    5

辞書からSeriesを作成する際の注意点

辞書からSeriesを作成する際、インデックスを同時に指定しようとする場合には注意が必要です。

辞書のキーにない値をインデックスに指定しようとした場合にNaNとなってしまいます。

data = {"リンゴ":1, "ゴリラ":2, "ラッパ":3, "パンダ":4}
index = ["リンゴ","ゴリラ","ラッパ","パンツ"]
Series5 = pd.Series(data,index=index)
Series5

>>リンゴ    1.0
  ゴリラ    2.0
  ラッパ    3.0
  パンツ    NaN

DataFrameとの互換性

SeriesはDataFrameとの互換性が高いです。Seriesは単体でDataFrameに変換でき、DataFrameは単一列を取り出すとSeriesになります。

#SeriesからDataFrameに直接変換可能
data = [1,2,3,4,5]
Series = pd.Series(data)
df = pd.DataFrame(Series)
type(df)

>>pandas.core.frame.DataFrame
df = pd.DataFrame([['Ken', 170, 60], ['Naoki', 160, 50], ['Yu', 165, 58]],
                  columns=['name', 'height', 'weight', ])
df

>>	name	height	weight
  0	Ken	170	60
  1	Naoki	160	50
  2	Yu	165	58

#DataFrameから1列取り出す
Series = df["name"]
type(Series)

>>pandas.core.series.Series

Pythonでデータサイエンスするなら

Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。

ややお値段高めですが、これ1冊で十分という内容・ボリュームなので、損はしないと思います^^

初学者の方にはこちらもオススメです^^

まとめ

PandasのSeriesの特徴と作成方法について紹介しました。SeriesはPandasにおいてDataFrameと並ぶ主要なデータ構造なので、是非その特徴を理解しておきたいですね!

ではでは👋