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

はじめに

こんにちは。キノコードです。

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

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

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

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’]=s3
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や人工知能のレッスンもアップしていく予定です。
気に入ってくださった方は、チャンネル登録をお願いします。
それでは、次回のレッスンでお会いしましょう。

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

■保存方法
Mac:右クリック⇒「リンク先を別名で保存」
Windows:右クリック⇒「名前を付けてリンク先を保存」

Jupyter Labのファイルはこちら

 

KinoCode チャンネル

YouTubeで毎日動画配信しています。
動画は3分間なので、
 ・通勤時間
 ・お昼休み
 ・お手すきのとき
 ・寝る前
など手軽に視聴できます。
 
ちょっとしたインプットにどうぞ!
 
▼チャンネル登録はこちらからどうぞ。