本パートでは、DataFrameを構成する列や行(1次元のデータ構造)に着目します。この1次元のデータ構造をSeries(シリーズ)といいます。
DataFrameとSeriesは、pandasのベースとなるデータ構造です。データ分析ではSeriesを通じた処理もよく行います。
Seriesに関する知識を得た後で、列とインデックスに関する処理方法について学びます。この処理は、データの結合などで利用します。
さらに、DataFrameやSeriesの概要を知るための属性やメソッドについても学びます。
また、欠損値についても簡単に学びます(概要を知るためのメソッドで欠損値を扱うため)。
本パート「Seriesとインデックスと欠損値」では、以下の項目について学びます。
- Seriesとは何か。Seriesの作成、取得、変更方法。
- インデックスから列に変える方法と、列からインデックスに変える方法。
- 欠損値とは何か。欠損値の判定方法や数え方。
- DataFrameやSeriesの型や形状や基本統計量の確認方法。
Seriesとは
DataFrameが2次元のデータであり、インデックスと列名一覧を持つことを学びました。
DataFrameが2次元であるのに対し、DataFrameの行や列は1次元のデータになります。そのため、DataFrameの変数dfにおいて、以下のようにlocやilocを使って抽出した結果はいずれも1次元のデータになります。
行:df.loc[行名]、df.iloc[行番号]
列:df[列名]、df.列名、df.loc[:, 列名]、df.iloc[: 列番号]
これら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
このように、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')
このように、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もインデックスを持っています。
演習
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
コメント