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と並ぶ主要なデータ構造なので、是非その特徴を理解しておきたいですね!
ではでは👋