見出し画像

AI 実装検定への道(10)

AI 実装検定 A級合格へ向けて学習を進めています。

前回投稿が9回目で、引き続きGoogle Colaboratoryを利用してプログラミングの章を進めて書いています。

第9回では、直接DataFrameを作成すること、Google Colaboratoryに用意されたサンプルデータからcsvファイルを読み込むこと(これは、道草の中でも勉強したので嬉しいですね)、pandasでの欠損処理について「dropna」を習得し、何も指定しないと行方向に削除、「columns」をしているすると列方向で削除。axis=1でも同様で、0にすると行方向となることまで確認しました!

公式テキスト、244ページから再開です!

前回に引き続き、欠損値のあるデータフレームを見ていきます。
今一度、前回同様にdf2を生成しておきます。

(コード記述)
df2=pd.DataFrame([
[5, np.nan, 3],
[2, 6, 8],
[np.nan, 7, 9],])
df2

(結果)

ここに4列めを追加します。

(コード記述)
df2[3]=np.nan
df2

(結果)

4列目に欠損値のみの列を追加した

これで、4列目に欠損値のみの列を追加できました。
この場合4列目のデータが全て欠損値なので、df2.dropna()とすると・・・

(コード記述)
df2.dropna()

(結果)

全部消えた!

こんなふうに、すべてのデータが消されて、列のタイトル(columns)のみが残ることになってしまいます。行方向、列方向に閾値(threshold)を決めることもできるそうです。thresh=3とすると、欠損値でない要素が3つ以上ある行が残されます。

(コード記述)
df2.dropna(axis="rows", thresh=3)

(結果)

1の行だけ残された

ここで、thresh=2として、欠損地でない要素が2つ以上・・・と考えましたが、設定ではどの行もそうなので、列方向に見ても面白くないですね・・・次に進みましょう。次は欠損値に数値を代入?(公式テキストには補いと書かれているが?)する方法を学びます。

まずは、サンプルを作成します。

(コード記述)
data1=pd.Series([5,np.nan,2,None,7], index=list("vwxyz"))
data1

(結果)

欠損値の部分に指定した数値で補うのが「fillna( )」。
やってみます。

(コード記述)
data1.fillna(9.8)

(結果)

これ、どういう時に役に立つのか分からないけど、例えばデータベースの欠損が出てしまった場合に、一応全体で成立させておかねばならないから、不都合のない秒数だけ入れておこうか・・・みたいな時に役立つんでしょうかね?

次は、「fillna( )」に続いて「method( )」。
これには、欠損値の前後の値で補う「ffill」と「bfill」があるそうです。

(コード記述)
data1.fillna(method="ffill")

(結果)

それぞれの欠損値の前の数値、5.0と2.0に置き換わった

(コード記述)
data1.fillna(method="bfill")

(結果)

それぞれの欠損値の後ろの数値、2.0と7.0に置き換わった

何だか、データ改竄のための手解きを受けているのでしょうかね??
ちょっと不思議ですが、欠損値が2つ続くような場合でも、出来るそうです。

(コード記述)
data2=pd.Series([2,5,np.nan,None,3,6,None,np.nan,7,9], index=list("lmnouvwxyz"))
data2

(結果)

もう一度、「method( )」に加えて、欠損値の前後の値で補う「ffill」と「bfill」を使ってみます。

(コード記述)
data2.fillna(method="ffill")

(結果)

上のNaNには、その上の5.0。下のNaNにはその前の6.0に変わっています。

(コード記述)
data2.fillna(method="bfill")

(結果)

上のNaNにはその下の3.0、下のNaNにはその下の7.0に置き換わっています。

ここまで、Seriesでの欠損値を見てきたが、次はDataFrameでやってみるようです。まずは、サンプルを生成します。

(コード記述)
df5=pd.DataFrame([{5,np.nan,8},{2,np.nan,1},{9,0,np.nan}])
df5

(結果)

ここでも「method( )」と欠損値の前後の値で補う「ffill」と「bfill」を使ってみるのですが、1次元のSeriesと違って、ここでは2次元のDataFrameなので、「axis」を使って行方向(1)、列方向(0)で指定するのだそうです。

(コード記述)
df5.fillna(method="ffill", axis=1)

(結果)

行方向に前の数値が入りました。

(コード記述)
df5.fillna(method="ffill", axis=0)

(結果)

2列目のNaNの前には数値がないので、そのままに。3列目のNaNには1.0が。

では、次に「bfill」を使ってみます。

(コード記述)
df5.fillna(method="bfill", axis=1)

(結果)

2列目のNaNには行方向の後ろ、それぞれ8.0と1.0が入ったが、3列目のNaNはそのまま

(コード記述)
df5.fillna(method="bfill", axis=0)

(結果)

2列目のNaNには列方向の後ろ0.0が入ったが、3列目のNaNはそのまま

だいたい理解できたように思います。

今回は短いですが、第20講がここで終わったので、一区切りとします。

今回は、前回に引き続き欠損値について学びました。
欠損値でのみ列を追加したり、前回同様「dropna」を使って欠損値を削除したり、その方向を行方向、列方向に閾値(threshold)を決めて割愛する「thresh」。その後に、欠損値に任意のデータを置き換える「fillna( )」、それに続いて「method( )」を用いて欠損値の前後の値で補う「ffill」と「bfill」。2次元のDataFrameではさらに「axis」を使って行方向(1)、列方向(0)を指定するというところまで辿り着きました。

次回は、公式テキスト250ページか第21講「pandasでデータセットの連結と計算」から再開します。

この記事が気に入ったらサポートをしてみませんか?