Pythonの言語は、今ではEXCELでも利用できるようになっています。
EXCELでのPython利用は、基本的にはデータ分析の分野で利用することになるでしょう。
Pythonには、データ分析に役立つ「Pandas」というライブラリがあります。
これまでにも概要をまとめた記事(リンク)がありますが、「データフレーム」という形で「データ」を扱えるのが特徴です。
今回は「Pandas」の中でも、欠損値の処理を行うメソッドについて、まとめようと思います。
欠損値(NaN)を特定の補完
以下のメソッドで、データフレーム内のNaN値を指定した値で置き換えます。
また引数は、以下を扱えます。
| 引数 | 説明 |
| value | 辞書形式で値を指定して、NaNを埋める。 |
| method | ffill: 前の値でNaNを埋める(順方向)。 bfill: 次の値でNaNを埋める(逆方向)。 |
| axis | 0:NaNがある行の1つ前/次の値で埋める。 1:NaNがある列の1つ前/次の値で埋める。 |
| inplace | True:元のデータにも、変更を適用する。 False:元のデータは、変更されない。(デフォルト) なお、Trueの時は、元のデータフレームが置き換わるので、新しい変数に代入することは無意味とされ、返り値も「None」となります。 |
| limit | NaNが連続して存在してる場合に、埋める回数を制限する。 |
| downcast | データ型を変更して値を埋める。(例: float → int) |
コードサンプル:
import pandas as pd
import numpy as np# サンプルデータ
data = {
‘A’: [1, np.nan, 3, np.nan, 5],
‘B’: [np.nan, 2, np.nan, np.nan, 5],
‘C’: [1, 2, 3, 4, 5]
}df = pd.DataFrame(data)
# ‘value’ を指定(特定の値で埋める)
filled_value = df.fillna(value={‘A’: 0, ‘B’: 99})# ‘method’ を指定(列方向の前の値で埋める)
filled_method = df.fillna(method=’ffill’, axis=1)# ‘limit’ を指定(行方向の埋める回数を制限)
filled_limit = df.fillna(method=’ffill’, limit=1)print(“元のデータフレーム:\n”, df)
print(“\n特定の値で埋める:\n”, filled_value)
print(“\n列方向の前の値で埋める’:\n”, filled_method)
print(“\n行方向の埋める回数を制限’:\n”, filled_limit)# ‘inplace’ を指定(元のデータフレームを変更)
df.fillna(value=0, inplace=True)print(“\n変更されたデータフレーム\n”, df)
# ‘downcast’ を指定(型を変更して埋める)
data_downcast = {
‘D’: [1, np.nan, 3, np.nan]
}
df_downcast = pd.DataFrame(data_downcast)
filled_downcast = df_downcast.fillna(value=0, downcast=’int’)print(“\nint型に変換\n”, filled_downcast)
実行結果:
元のデータフレーム:
A B C
0 1.0 NaN 1
1 NaN 2.0 2
2 3.0 NaN 3
3 NaN NaN 4
4 5.0 5.0 5特定の値で埋める:
A B C
0 1.0 99.0 1
1 0.0 2.0 2
2 3.0 99.0 3
3 0.0 99.0 4
4 5.0 5.0 5前の値で埋める’:
A B C
0 1.0 1.0 1.0
1 NaN 2.0 2.0
2 3.0 3.0 3.0
3 NaN NaN 4.0
4 5.0 5.0 5.0埋める回数を制限’:
A B C
0 1.0 NaN 1
1 1.0 2.0 2
2 3.0 2.0 3
3 3.0 NaN 4
4 5.0 5.0 5変更されたデータフレーム
A B C
0 1.0 0.0 1
1 0.0 2.0 2
2 3.0 0.0 3
3 0.0 0.0 4
4 5.0 5.0 5int型に変換
D
0 1
1 0
2 3
3 0
なお、int型に変換する際、元のデータの小数点以下が「0」出ない値の場合は、int変換はできません。
これは、データ分析を行う上で、意図しない情報の欠落は阻止しなければいけないためです。
コードサンプル:
import pandas as pd
import numpy as np# ‘downcast’ を指定(型を変更して埋める)
data_downcast = {
‘D’: [1.1, np.nan, 3.3, np.nan]
}df_downcast = pd.DataFrame(data_downcast)
filled_downcast = df_downcast.fillna(value=0, downcast=’int’)
print(“\nint型に変換\n”, filled_downcast)
実行結果:
int型に変換
A
0 1.1
1 0.0
2 3.3
3 0.0
もし意図的に、欠落するような型変換(例:float ⇒ int)を行いたい場合は、明示的に「切り捨て」「丸め処理」を行う必要があります。
コードサンプル:
import pandas as pd
import numpy as np# ‘downcast’ を指定(型を変更して埋める)
data_downcast = {
‘A’: [1.1, np.nan, 3.3, np.nan, 5.5]
}df_downcast = pd.DataFrame(data_downcast)
# NaNを埋める
filled_downcast = df_downcast.fillna(value=0)# 切り捨て処理
filled_downcast_astype = filled_downcast.copy()
filled_downcast_astype[‘A’] = filled_downcast[‘A’].astype(int)# 丸め処理
filled_downcast_round = filled_downcast.copy()
filled_downcast_round[‘A’] = filled_downcast[‘A’].round().astype(int)print(“\nint型に切り捨てて変換\n”, filled_downcast_astype)
print(“\nint型に丸めて変換\n”, filled_downcast_round)
実行結果:
int型に切り捨てて変換
A
0 1
1 0
2 3
3 0
4 5int型に丸めて変換
A
0 1
1 0
2 3
3 0
4 6
まとめ
今回は、Pythonで扱えるライブラリの「Pandas」のメソッドについてまとめてみました。
他にも多くのメソッドが存在するため、複数の記事に渡って解説しています。
他の記事も、ぜひ参考にしてみて下さい。