Seriesの基礎

本パートでは、DataFrameを構成する列や行(1次元のデータ構造)に着目します。この1次元のデータ構造をSeries(シリーズ)といいます。
DataFrameとSeriesは、pandasのベースとなるデータ構造です。データ分析ではSeriesを通じた処理もよく行います。

Seriesに関する知識を得た後で、列とインデックスに関する処理方法について学びます。この処理は、データの結合などで利用します。
さらに、DataFrameやSeriesの概要を知るための属性やメソッドについても学びます。
また、欠損値についても簡単に学びます(概要を知るためのメソッドで欠損値を扱うため)。

本パート「Seriesとインデックスと欠損値」では、以下の項目について学びます。

  • Seriesとは何か。Seriesの作成、取得、変更方法。
  • インデックスから列に変える方法と、列からインデックスに変える方法。
  • 欠損値とは何か。欠損値の判定方法や数え方。
  • DataFrameやSeriesの型や形状や基本統計量の確認方法。

Seriesとは

DataFrameが2次元のデータであり、インデックスと列名一覧を持つことを学びました。

https://images.pyq.jp/repo/prod/pandas_structure_series_v2/pandas_structure_series_0z.jpg

DataFrameが2次元であるのに対し、DataFrameの行や列は1次元のデータになります。そのため、DataFrameの変数dfにおいて、以下のようにlocやilocを使って抽出した結果はいずれも1次元のデータになります。

行:df.loc[行名]、df.iloc[行番号]
列:df[列名]、df.列名、df.loc[:, 列名]、df.iloc[: 列番号]

https://images.pyq.jp/repo/prod/pandas_structure_series_v2/pandas_structure_series_00.jpg

これら1次元のデータは、Series(シリーズ)という型になります。

Seriesは、DataFrameの内部で利用される重要な型です。

Seriesの作成

Seriesを作成するには、pd.Seriesクラスを使って下記のようにします。

pd.Series(データ, index=インデックス, name=名前)
sr = pd.Series([17, 24, 29], index=[10, 20, 30], name="Age")
sr
10    17
20    24
30    29
Name: Age, dtype: int64
https://images.pyq.jp/repo/prod/pandas_structure_series_v2/pandas_structure_series_02.jpg

このように、Seriesはデータだけでなく、名前(name)とインデックス(index)という情報を持ちます。

Indexの作成

DataFrameのインデックスや列名一覧は、Index型のオブジェクトです。
次のクエストで列とインデックスを扱うため、その準備としてIndexを単独で作成する方法について学びます。

Indexを作成するには、pd.Indexクラスを使って下記のようにします。

pd.Index(データ, name=名前)

具体的には、下記のようになります。

idx = pd.Index([10, 20, 30], name="MyIndex")
idx
Int64Index([10, 20, 30], dtype='int64', name='MyIndex')
https://images.pyq.jp/repo/prod/pandas_structure_series_v2/pandas_structure_series_03.jpg

このように、Indexも、データだけでなく名前(name)を持ちます。

省略時の値

SeriesやIndexの名前は、作成時に引数nameで指定できます。省略した場合、名前はNoneになります。作成後の名前はname属性で取得できます。

また、Seriesのインデックスは作成時に引数indexで指定できます。省略した場合、インデックスは0から始まる通し番号になります。作成後のインデックスはindex属性で取得できます。

演習

import pandas as pd
sr = pd.Series([17, 24, 29], index=[10, 20, 30], name="Age")
sr
10    17
20    24
30    29
Name: Age, dtype: int64

nameで名前を確認します。作成時に指定した”Age”を取得できます。

sr.name
'Age'

indexでインデックスを確認します。Int64Index(...)と表示されますが、Int64Index型はIndex型のサブクラスです。引数を整数にするとInt64Indexになりますが、「Indexの一種」ということだけ覚えれば大丈夫です。

sr.index
Int64Index([10, 20, 30], dtype='int64')

次に、Indexを作成します。これもInt64Index(...)と表示されますが、「Indexの一種」ということです。

idx = pd.Index([10, 20, 30], name="MyIndex")
idx
Int64Index([10, 20, 30], dtype='int64', name='MyIndex')

nameで名前を確認します。作成時に指定した”MyIndex”を取得できます。

idx.name
'MyIndex'

Seriesの要素の取得と変更

Seriesの変数srの要素は、下記のように行名を使って取得できます。

sr[行名]

また、下記のように変更できます。

sr[行名] = 新しい値

さらに、DataFrameと同様に、Seriesもlocやilocを使った取得・変更が可能です。sr[行名]は、sr.loc[行名]を省略した書き方です。

ここでの行名とは、1問目で確認した「Seriesが持つインデックス」の要素です。
下図はDataFrameの図ですが、DataFrameと同様にSeriesもインデックスを持っています。

https://images.pyq.jp/repo/prod/pandas_structure_series_v2/pandas_structure_dataframe_02.jpg

演習

import pandas as pd

まずは、この問題で扱うSeriesを作成します。

sr = pd.Series([17, 24, 29], index=[10, 20, 30], name="Age")
sr
10    17
20    24
30    29
Name: Age, dtype: int64

行名が20の値を確認します

sr[20]
24

行名が20の値を25に変更します。

sr[20] = 25
sr
10    17
20    25
30    29
Name: Age, dtype: int64

sr[20]は、sr.loc[20]と同じです。

sr.loc[20]
24

行名が20の値を25に変更します。

sr[20] = 25
sr
10    17
20    25
30    29
Name: Age, dtype: int64

sr[20]は、sr.loc[20]と同じです。

sr.loc[20]
25

DataFrame同様、Seriesもilocを使えます。sr.iloc[1]と書くと、行番号1の値を取得できます。

sr.iloc[1]
25

コメント

タイトルとURLをコピーしました