Pandas入門|05.シリーズ (Series) とは【Pythonの必須ライブラリのPandasを初心者にわかりやすく解説】

こんにちは。キノコードです。
この動画では、シリーズの使い方について説明します。初心者の方でもわかりやすいように丁寧な解説を心がけました。目次は上記になります。

DataFrameとは、エクセルの表形式のように、行と列で成り立っているイメージです。
Seriesとは、DataFrameから1列取り出した時にできる型でもあり、Pythonでいうリストのようなものにindexというものがくっついているイメージです。DataFrameから1列抽出するとSeriesになり、DataFrameはSeriesをまとめたものとも言えます。
したがって、Seriesの理解を深めることは、DataFrameの理解を深めることにもなります。
Pandasで非常によく使うDataFrameの理解を深めるために、Seriesをきちんと理解しておきましょう。

この記事の信頼性

この記事は、Youtubeにて日本最大級のプログラミング教育のチャンネルを運営しているキノコードが執筆、監修しています。
私自身は、2012年からプログラミング学習を始め、2019年以降はプログラミング教育に携わってきた専門家です。
他にも、私には下記のような実績や専門性があります。

  • キノコードは毎月10名以上、合計100名以上ののプログラミング学習者と1対1でお悩みを聞き、アドバイスをしています
  • キノコード自身は、プログラミングスクールに通ったり、本や有料の動画で勉強してきた経験もあります
  • キノコードは、Python学習サービス「キノクエスト」を運営しています
  • 本の出版、プログラミング雑誌への寄稿の実績があります

Python学習サービス「キノクエスト」のご紹介

キノコードでは、Pythonを習得するためのPython学習サービス「キノクエスト」を運営しています。
キノクエストには、学習カリキュラムがあり、学習順番に悩むことなく学習を進められます。
月額1,990円と本1冊分の値段です。

キノクエストの特徴は下記の通りです。

  • Python学習をしている仲間が集まるコミュニティがある
  • 1000問以上の問題を解いてプログラミングを習得
  • 環境構築不要ですぐに始められる
  • 動画と連動しているので、インプットもできる。
  • 月額1,990円で、コミュニティもセット

キノクエストを詳しく知りたい方は、紹介ページをご覧ください。

▼キノクエストの紹介ページはこちら▼
https://kino-code.com/kq_service_a/

レッスンで使ったファイルはこちら

キノクエストでアカウントの新規登録に進み、メール認証を完了します。

ログインした状態(プラン選択画面が表示されます)で下記のボタンをクリックいただくか、ファイルダウンロードページのURL:https://kinoquest.jp/main/file_download/を直接アドレスバーに入力ください。

それでは解説をはじめます。

Pandasインポート

import pandas as pd

それでは、Pandasをインポートするところから始めていきましょう。
まず、Pandasをインポートする記述を書きます。
「import pandas as pd」を書きます。
「as」は、ライブラリ名(pandas)を好きな名前で使うことができます。
したがって、この記述により「pandas」を「pd」という名前で使うことができます。
エラーにならず、インポートが完了しました。

リストを使ったSeries作成方法

s1 = pd.Series([90,78,65,87,72])
s1

それでは、Seriesの作成方法を3つ説明します。
1つめは、リストを用いて、Seriesを作る方法です。
s1という変数を書いて、イコール、pd、Seriesを書きます。
そして、引数の中に、リストを書いて、適当なデータを書きます。
リストの詳細については、「Python超入門コース リスト」をご覧ください。右上にカードがでているはずです。
右上にカードが表示されます。
それでは、実行してみましょう。
左側がindexで、右側がデータ部分です。整数型であることがわかります。

data = [90, 78, 65, 87, 72]

リストを変数に入れてから、Seriesを作るとコードがすっきりします。

s1 = pd.Series(data)
s1

変数をSeriesの丸括弧の中に記述します。
実行してみます。
表示されましたね。

Numpyインストール

import numpy as np

2つめは、Numpyを使ってSeriesを作る方法です。
まず、NumPyをインポートしてから始めます。
NumPyとは、Pythonのライブラリで、高速にリストの計算をするためのライブラリのことです。
このNumPyをもとにSeiresを作ることができます。
ここでも「as」を書いて、「numpy」を「np」という名前で使えるようにします。
インポートします。
これで、Numpyを使えるようになりました。

Numpyを使ったSeries作成方法

np.arange(1, 10, 2)

このNumpyのarange関数を使うと配列を作ることができます。そして、この配列からSeriesを作ることができます。
1からスタートしていき、1.3.5のように奇数の配列を作ります。
まず、np.arange(1, 10, 2)と記述すると、1からスタートして10で終わり、2ずつ増やしていくarangeができます。
まず、np.arange(1, 10, 2)(エーレンジ)と記述すると、1からスタートして10まで、2ずつ増えていく配列ができます。
実行して表示させてみましょう。奇数の配列ができました。

s2 = pd.Series(np.arange(1, 10, 2))
s2

これをSeriesの中の丸括弧の中に記述します。
ここまでは、リストを用いて、Seriesを作る方法と一緒ですね。
実行して確認してみましょう。
奇数のSeriesができました。

data = np.arange(1, 10, 2)
s2 = pd.Series(data)
s2

配列をdataに代入してから作ることもできますよね。
実行してみましょう。
Seriesができています。
3つのSeriesの作り方は辞書型を使って作成の方法です。
こちらについては、説明のわかりやすさの観点から、動画の真ん中の方で説明します。

データ型の取得

s1

次に、Seriesのデータ部分のデータ型を確認してみましょう。s1のSeriesはこのような感じでしたね。

s1.dtypes

dtypesを使うとデータ型を確認することができます。s1、ドット、dtypesを書きます。
それでは、実行してみましょう。
実行してみましょう。
データ型が表示され、整数型で作成されていることが分かります。

index取得

s2.index

次に、indexを取得する方法を説明します。
変数を書いて、ドット、indexを書きます。
index属性を書くと、indexを取得することができます。
それでは、実行してみましょう。
indexが取得できました。0から始まり5で終わり、1ずつ増えていくindexであることが確認できます。

s1.index = [‘sato’, ‘suzuki’, ‘takahashi’, ‘tanaka’, ‘ito’]
s1

次に、indexを変更する方法を説明します。
s1のindexは、数字でしたよね。
indexを名前に変えてみましょう。
これに、名前のリストを代入します。
それでは、実行してみましょう。
indexが変更されました。

s1.index

indexを確認してみましょう。
変更されていることをここでも確認できます。

辞書型を使ったSeries作成方法

dict01 = {‘sato’:90, ‘suzuki’:78, ‘takahashi’:65, ‘tanaka’:87, ‘ito’:72}
s3 = pd.Series(dict01)
s3

ここで3つ目のSeriesの作り方です。
辞書型を使ってSeriesの作り方です。
辞書型は、KeyとValueで成り立っています。
辞書型についてもPython入門講座を作る予定なので、そちらで詳しく説明します。
それでは、KeyとValueをセットで先ほどSeriesで作った同じ組み合わせのデータを作ります。
これはdict01という変数に代入します。
それをSeriesの丸括弧の中に代入すればSeriesが作れます。
実行してみましょう。
Seriesができています。

値の取得

s2.values

次に、Seriesの値を取得する方法をいくつか紹介します。
1つ目に、valuesと使う方法です。
変数を書いて、ドット、valuesを書きます。
valuesを使うと、値を取得することができます。
それでは、実行してみましょう。
値が取得できました。

s1[‘suzuki’]

2つ目に、Seriesにindexを指定して、値を取得する方法です。
それでは、suzukiの点数を取得していきます。
変数を書いて、角括弧、シングルクォーテーション、indexにsuzukiと書きます。
それでは、実行してみましょう。
suzukiの点数の78が表示されました。

s1[1]

3つ目に、indexを数値に置き換えて、値を取得する方法です。
数値を指定して値を取得するときは、先頭から0、1、2と指定してします。
つまり、satoの値は0、suzukiの値は1、takahashiの値は2のように、数値を指定するとそれぞれの値を取得することができます。
それでは、実行してみましょう。
indexを指定した方法と同じ結果が得られました。

複数の値の取得

s1[[‘suzuki’,’tanaka’]]

次に、リストを用いて複数の値を取得する方法を説明します。
変数を書いて、角括弧、角括弧の中に名前のリストを書きます。
今回は、suzukiとtanakaの値を取得します。
それでは、実行してみましょう。
suzukiとtanakaの点数が表示されました。

s1[[1, 3]]

さきほどと同様に、こちらも数値で値を取得することができます。
それでは、実行してみましょう。
同じ結果が得られました。

比較演算子使った抽出方法

s1[s1 > 80]

次に、80点より大きいデータだけ抽出する方法を説明します。
具体的には、Series内のデータが80点より大きいか判定し、条件に当てはまったもののみを抽出します。
まず、比較演算子を使って、80点より大きいか判定します。
s1と書いて、>、80と書きます。
実行すると、80点より大きいデータはTure、小さいデータはFalseが表示されます。
それでは実行します。
80点より大きいデータはTure、小さいデータはFalseが表示されました。
それでは、80点より大きいデータを抽出してみましょう。
まず、変数を書いて、角括弧、さきほど判定したものを書きます。
それでは、実行してみます。
80点より大きいものだけ抽出できました。

s1[s1 <= 80]

ちなみに、比較演算子は、超えるや未満、以上や以下、等号も指定することができます。
80以下も試してみましょう。
実行してみます。
80点以下のデータが抽出できました。

要素数の取得

s1.size

次に、Seriesの要素数を取得する方法を説明します。
変数を書いて、ドット、sizeを書きます。
それでは、実行してみましょう。
要素数が取得できました。

len(s1)

sizeのほかにlen関数を使うと、要素数を調べることができます。
lenを書いて、丸括弧、丸括弧の中に、要素数を調べたいSeriesを書きます。
それでは、実行してみましょう。
この方法でも要素数を取得することができました。

indexとデータ部分に名前を付ける

s1.index.name = ‘member’
s1.name = ‘score’
s1

次に、indexとデータ部分に名前を付ける方法を説明します。
Seriesは、indexとデータ部分で構成されています。
そのindexとデータ部分に名前をつけていきます。
変数を書いて、ドット、index、ドット、nameを書きます。
index.nameを使うと、indexに名前をつけることができます。
そして、memberという名前を代入します。
これでindexに名前が付きます。
つづいて、データ部分にも名前をつけていきます。
変数を書いて、ドット、nameを書きます。
nameを使うと、データ部分に名前を付けることができます。
データ部分は点数を表しているので、scoreを代入します。
それでは、実行してみましょう。
indexとデータ部分に名前が付きました。

Seriesの四則演算

s1 + 2

次に、四則演算の方法を説明します。
最初に、足し算をみていきましょう。
まず、Seriesに2を足してみます。
変数を書いて、プラス(+)、2を書きます。
実行すると、Seriesの全てのデータに2が足されます。
それでは、実行してみます。
全体に2が足されました。

s1 – 2
s1 * 2
s1 / 2

次に、引き算、掛け算、割り算を試してみます。
引き算はマイナス、掛け算はアスタリスク、割り算はスラッシュでできます。
それでは、数値の2を使って、それぞれ計算してみます。
それでは、実行してみます。
四則演算ができました。

s5 = pd.Series([‘test’])
s5
s5 + 2

ちなみに、文字列のデータに四則演算をするとエラーがでます。
文字列に2を足してみましょう。
エラーがでました。

Series同士の計算

s2.index = [‘suzuki’, ‘takahashi’, ‘tanaka’, ‘ito’, ‘watanabe’]
s2

次に、Series同士で足し算をする方法を説明します。
Series同士に同じindex名があるとき、足し算をすることができます。
例えば、Seriesにindex名Aがあったとします。
もう一つのSeriesも同様にindex名Aがあったとします。
index名が同じとき、同じindexのデータを足すことができます。
なお、どちらのSeriesにも同じindex名がないときは足し算がされず、indexとデータが追加されます。
つまり、足されるSeries(s1)とindex名があるときは足し算、足すSeries(s2)
もし、一方のSeriesにしかindexがないときはどうなるのでしょうか。
違いが分かるように、それぞれのSeriesにしかないように、s2のindexを変更します。

s1 + s2

それでは、計算する準備が整いましたので、SeriesとSeriesを足していきます。
Series、プラス、Seriesを書きます。
それでは、実行してみます。
indexは自動で追加されました。
indexが一致するものは足し算がされますね。
一方、どちらかのSeriesにしかindexがないものは、NaNとなってSeriesに追加されます。

欠損値確認(hasnans)

s2.hasnans

次に、Seriesに欠損値(NaN)が含まれているか確認する方法を説明します。
欠損値とは、値が存在しない要素のことです。Not A Numberの略で、NaNと表示されます。
変数を書いて、ドット、hasnansを書きます。
hasnansを使うと、NaNがあるときTrue、NaNがないときFalseが返ってきます。
それでは、実行してみましょう。
NaNがないので、Falseが表示されました。
欠損値があるとき、Trueが返ってくるか確認してみましょう。

s4 = pd.Series([90, 78, 65, None, 72])
s4

3つ目の要素をNoneにしたSeriesを作ります。
Noneは、空っぽという意味で、何も値がない状態のことを指します。
それでは、実行してNaNになっているか確認してみましょう。
4つ目がNaNになっていますね。

s4.hasnans

それでは、hasnans使って、Trueが返ってくるか確認してみましょう。
ちゃんと、Trueが返ってきましたね。

欠損値確認(isnull)

pd.isnull(s4)

どこの値がnullなのか確認することもできます。
pdドットisnull。丸括弧の中にSeriesを記述します。
実行します。
欠損値のところだけTrueとなっています。

DataFrame作成

df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]],
columns=[‘col01’, ‘col02’, ‘col03’],
index=[‘idx01’, ‘idx02’, ‘idx03’])
df

次に、DataFrameを使って、Seriesとの関係をみていきましょう。
DataFrameの詳しい説明は、Pandas超入門コースをご覧ください。
まず、DataFrameを作ります。
カラム名は、「col01~03」とします。
index名は、「idx01~03」とします。
データ部分は1〜9としましょう。
実行してみます。
このようなDataFrameです。
このDataFrameから列を取り出すとSeriesになります。

DataFrameからSeries取得

df[‘col01’]

col01の列を抽出してみましょう。
dfを書いて、角括弧、シングルクォーテーション、カラム名を書きます。
それでは、実行してみます。
Seriesになってますね。

type(df[‘col01’])

次に、typeを使って、データ型を確認してみましょう。
typeと書いて、丸括弧、丸括弧の中にDataFrameから取得したSeriesを書きます。
それでは、実行してみます。
Seriesと表示されました。
このように、DataFrameから1列取り出すとSeriesであることが分かりましたね。

DataFrameにSeries追加

s3 = pd.Series({‘idx01’:10, ‘idx02’:11, ‘idx03’:12})
s3

次に、SeriesをDataFrameに追加する方法を説明します。
まず、追加するSeriesを作ります。
indexをidx01~03までとして、値も10〜12とします。これをs3という変数に代入します。

df[‘col04’]=s5
df

これをcol4というカラムに代入します。
実行してみましょう。
DataFrameに追加することができました。

s6 = pd.Series({‘idx03’:13, ‘idx04’:14, ‘idx05’:15})
s6

index名が違った場合はどうなるでしょうか?
インデックス名をidx03だけ同じにして、それ以外は違う名前にします。

df[‘col05’] = s6
df

これをcol5というカラムに代入してみます。
実行します。
idx03以外はくっつけることができませんでした。

時系列データ

dates = pd.date_range(‘2000/01/01′, periods=5,freq=’D’)
dates

最後に、Seriesでは、時系列データを扱うこともできます。
時系列のデータを作成してみてみます。
これをSeriesに変換します。

pd.Series(dates)

日付型のSeriesができました。
indexに指定することもできます。

s1
s1.index = dates
s1

indexが時系列になると、特殊な集計ができるようになります。
これはDataFrameの時系列データのところで詳しく説明しますので、そちらをご参考ください。

確認問題

最後に確認問題をやっていきましょう。

name = [‘sato’, ‘ito’]
score = [90, 80]
dict = {‘ito’: ’50’, ‘suzuki’: None}
df = pd.DataFrame([[90, 75], [60, 95]], index = [‘sato’, ‘ito’], columns = [‘English’, ‘Math’])

確認問題をするために、これらを用意していきました。
簡単に説明します。
リスト型が入った変数、辞書型が入った変数、このようなデータフレームを用意しました。
①リスト型の変数を使って、Seriesを作ってください。インデックス名は、nameを使ってください。
②辞書型の変数を使って、Seriesを作ってください。
③1つめに作ったSeriesのインデックスを取得してください。
④2つめに作ったSeriesの値を取得してください。
⑤比較演算子を使って、1つめに作ったSeriesの90点のデータを取得してください。
⑥2つめに作ったSeriesに「Nan」があるか確認してください。
⑦1つめに作ったSeriesをScienceのカラム名として、データフレームに追加してください。

答え合わせです。

s_list = pd.Series(score, name)

s_dict = pd.Series(dict)

s_list.index

s_list.values

s_list[s_list == 90]

pd.isnull(s_dict)

df[‘Science’] = s_list

キノコードでは、pythonやPandasの他に、データ可視化のmatplotlibや人工知能のレッスンもアップしていく予定です。
気に入ってくださった方は、チャンネル登録をお願いします。
それでは、次回のレッスンでお会いしましょう。