[Python] dropna関数の使い方 – 欠損値(NaN)を削除する
dropna
は、Pandasライブラリでデータフレームやシリーズから欠損値(NaN)を削除するための関数です。
デフォルトでは、行に1つでもNaNが含まれている場合、その行全体が削除されます。
axis=1
を指定すると、列単位でNaNを含む列が削除されます。
how='all'
を指定すると、すべての値がNaNの行や列のみが削除されます。
thresh
引数を使うと、NaN以外の値が指定数以上ある行や列を残すことができます。
dropna関数とは
dropna関数
は、Pandasライブラリにおいてデータフレームやシリーズから欠損値(NaN)を削除するための非常に便利なメソッドです。
データ分析や前処理の際に、欠損値が存在すると計算や解析に影響を及ぼすため、これを適切に処理することが重要です。
dropna関数
を使用することで、行や列単位で欠損値を簡単に削除でき、データの整合性を保つことができます。
引数を指定することで、削除の条件を柔軟に設定できるため、特定の列や行に対してのみ操作を行うことも可能です。
これにより、データのクリーンアップが効率的に行え、分析の精度を向上させることができます。
dropna関数の基本的な使い方
行単位でのNaN削除
行単位でNaNを削除するには、dropna関数
をそのまま使用します。
デフォルトでは、NaNを含む行が削除されます。
以下はそのサンプルコードです。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, 2, None, 4],
'B': [None, 2, 3, 4],
'C': [1, None, None, 4]
}
df = pd.DataFrame(data)
# NaNを含む行を削除
df_cleaned = df.dropna()
print(df_cleaned)
A B C
1 2.0 2.0 NaN
3 4.0 4.0 4.0
このコードでは、NaNを含む行が削除され、残った行のみが表示されます。
列単位でのNaN削除
列単位でNaNを削除するには、axis
引数を1に設定します。
これにより、NaNを含む列が削除されます。
以下はそのサンプルコードです。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, 2, None, 4],
'B': [1, 2, 3, 4],
'C': [1, None, None, 4]
}
df = pd.DataFrame(data)
# NaNを含む列を削除
df_cleaned = df.dropna(axis=1)
print(df_cleaned)
B
0 1
1 2
2 3
3 4
このコードでは、NaNを含む列が削除され、残った列のみが表示されます。
inplace引数の使い方
inplace
引数をTrue
に設定すると、元のデータフレームが直接変更され、戻り値はNone
になります。
以下はそのサンプルコードです。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, 2, None, 4],
'B': [None, 2, 3, 4],
'C': [1, None, None, 4]
}
df = pd.DataFrame(data)
# 元のデータフレームを直接変更してNaNを含む行を削除
df.dropna(inplace=True)
print(df)
A B C
3 4.0 4.0 4.0
このコードでは、inplace=True
により、元のデータフレームが直接変更され、NaNを含む行が削除されています。
how引数の使い方(‘any’と’all’の違い)
how
引数を使用することで、NaNを削除する条件を指定できます。
'any'
を指定すると、1つでもNaNが含まれる行や列が削除され、'all'
を指定すると、すべての値がNaNである行や列のみが削除されます。
以下はそのサンプルコードです。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, None, None, 4],
'B': [None, None, None, 4],
'C': [1, None, None, 4]
}
df = pd.DataFrame(data)
# 'any'を指定してNaNを含む行を削除
df_any = df.dropna(how='any')
print("how='any':")
print(df_any)
# 'all'を指定してNaNがすべての行を削除
df_all = df.dropna(how='all')
print("\nhow='all':")
print(df_all)
how='any':
A B C
3 4.0 4.0 4.0
how='all':
A B C
0 1.0 NaN 1.0
3 4.0 4.0 4.0
このコードでは、how='any'
の場合は1つでもNaNが含まれる行が削除され、how='all'
の場合はすべての値がNaNである行のみが削除されています。
thresh引数の使い方
thresh
引数を使用すると、指定した数以上の非NaN値を持つ行や列のみを残すことができます。
以下はそのサンプルコードです。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, None, None, 4],
'B': [None, 2, 3, 4],
'C': [1, None, None, 4]
}
df = pd.DataFrame(data)
# 非NaN値が2つ以上の行を残す
df_thresh = df.dropna(thresh=2)
print(df_thresh)
A B C
0 1.0 NaN 1.0
3 4.0 4.0 4.0
このコードでは、非NaN値が2つ以上の行のみが残され、条件を満たさない行が削除されています。
subset引数で特定の列を指定する
subset
引数を使用すると、特定の列に対してのみNaNを削除することができます。
以下はそのサンプルコードです。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, None, 3, 4],
'B': [None, 2, None, 4],
'C': [1, None, 3, None]
}
df = pd.DataFrame(data)
# 特定の列'B'に対してNaNを削除
df_subset = df.dropna(subset=['B'])
print(df_subset)
A B C
1 NaN 2.0 NaN
3 4.0 4.0 NaN
このコードでは、列’B’にNaNが含まれる行が削除され、他の列のNaNには影響を与えません。
dropna関数の応用例
特定の列にNaNがある行だけを削除する
特定の列にNaNが含まれる行だけを削除するには、subset
引数を使用します。
以下のサンプルコードでは、列’A’にNaNがある行を削除しています。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, None, 3, 4],
'B': [None, 2, None, 4],
'C': [1, None, 3, 4]
}
df = pd.DataFrame(data)
# 列'A'にNaNがある行を削除
df_cleaned = df.dropna(subset=['A'])
print(df_cleaned)
A B C
0 1.0 NaN 1.0
2 3.0 NaN 3.0
3 4.0 4.0 4.0
このコードでは、列’A’にNaNが含まれる行が削除され、他の列には影響を与えません。
NaNが一定数以上ある行や列を削除する
thresh
引数を使用することで、NaNが一定数以上ある行や列を削除することができます。
以下のサンプルコードでは、非NaN値が2つ以上の行を残しています。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, None, None, 4],
'B': [None, 2, 3, None],
'C': [1, None, None, 4]
}
df = pd.DataFrame(data)
# 非NaN値が2つ以上の行を残す
df_cleaned = df.dropna(thresh=2)
print(df_cleaned)
A B C
0 1.0 NaN 1.0
3 4.0 NaN 4.0
このコードでは、非NaN値が2つ以上の行のみが残され、条件を満たさない行が削除されています。
複数の条件を組み合わせたNaN削除
複数の条件を組み合わせてNaNを削除することも可能です。
例えば、特定の列にNaNがある行を削除し、さらに非NaN値が2つ以上の行を残すことができます。
以下のサンプルコードを参照してください。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, None, 3, 4],
'B': [None, 2, None, 4],
'C': [1, None, 3, 4]
}
df = pd.DataFrame(data)
# 列'A'にNaNがある行を削除し、非NaN値が2つ以上の行を残す
df_cleaned = df.dropna(subset=['A']).dropna(thresh=2)
print(df_cleaned)
A B C
0 1.0 NaN 1.0
3 4.0 4.0 4.0
このコードでは、列’A’にNaNがある行が削除された後、非NaN値が2つ以上の行のみが残されています。
NaNを含むデータの一部だけを削除する
特定の条件に基づいてNaNを含むデータの一部だけを削除することも可能です。
例えば、列’A’がNaNである行を削除し、列’B’がNaNである行はそのまま残す場合、以下のように記述します。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, None, 3, 4],
'B': [None, 2, None, 4],
'C': [1, None, 3, 4]
}
df = pd.DataFrame(data)
# 列'A'がNaNである行を削除
df_cleaned = df.dropna(subset=['A'])
print(df_cleaned)
A B C
0 1.0 NaN 1.0
2 3.0 NaN 3.0
3 4.0 4.0 4.0
このコードでは、列’A’がNaNである行が削除され、列’B’がNaNである行はそのまま残されています。
これにより、必要なデータを保持しつつ、特定の条件に基づいてNaNを削除することができます。
dropna関数と他の欠損値処理方法の比較
fillna関数との違い
fillna関数
は、欠損値(NaN)を特定の値や方法で埋めるためのメソッドです。
一方、dropna関数
は欠損値を含む行や列を削除します。
以下にそれぞれの特徴を示します。
メソッド | 概要 | 使用例 |
---|---|---|
dropna | NaNを含む行や列を削除 | df.dropna() |
fillna | NaNを特定の値や方法で埋める | df.fillna(0) |
例えば、fillna
を使用してNaNを0で埋める場合、以下のように記述します。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, None, 3, 4],
'B': [None, 2, None, 4]
}
df = pd.DataFrame(data)
# NaNを0で埋める
df_filled = df.fillna(0)
print(df_filled)
A B
0 1.0 0.0
1 0.0 2.0
2 3.0 0.0
3 4.0 4.0
このように、fillna
はデータを保持しつつ欠損値を埋めるのに対し、dropna
はデータを削除します。
interpolate関数との違い
interpolate関数
は、欠損値を周囲のデータから推測して埋めるためのメソッドです。
これに対して、dropna
は欠損値を含む行や列を削除します。
以下にそれぞれの特徴を示します。
メソッド | 概要 | 使用例 |
---|---|---|
dropna | NaNを含む行や列を削除 | df.dropna() |
interpolate | 周囲のデータを基にNaNを推測して埋める | df.interpolate() |
例えば、interpolate
を使用してNaNを推測して埋める場合、以下のように記述します。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, None, 3, 4],
'B': [None, 2, None, 4]
}
df = pd.DataFrame(data)
# NaNを周囲のデータから推測して埋める
df_interpolated = df.interpolate()
print(df_interpolated)
A B
0 1.0 2.0
1 2.0 2.0
2 3.0 3.0
3 4.0 4.0
このように、interpolate
はデータの傾向を考慮して欠損値を埋めるのに対し、dropna
はデータを削除します。
欠損値を削除する場合と補完する場合の使い分け
欠損値を削除するか補完するかは、データの特性や分析の目的によって異なります。
以下のポイントを考慮して使い分けると良いでしょう。
- データの重要性: 欠損値が多い場合、データを削除すると情報が失われる可能性があります。
この場合、補完を検討します。
- データの分布: データが均一に分布している場合、補完が効果的ですが、偏りがある場合は削除が適切なこともあります。
- 分析の目的: モデルの精度を重視する場合、補完が必要ですが、データのクリーンさを重視する場合は削除が適切です。
これらの要素を考慮し、適切な方法を選択することが重要です。
dropna関数を使う際の注意点
inplace=Trueのリスク
dropna関数
のinplace
引数をTrue
に設定すると、元のデータフレームが直接変更され、戻り値はNone
になります。
このため、元のデータを保持したい場合には注意が必要です。
意図せずデータを失うリスクがあるため、特に重要なデータを扱う際には、inplace=False
(デフォルト)で使用するか、事前にデータのコピーを作成しておくことをお勧めします。
以下はそのサンプルコードです。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, None, 3, 4],
'B': [None, 2, None, 4]
}
df = pd.DataFrame(data)
# inplace=TrueでNaNを含む行を削除
df.dropna(inplace=True)
# 元のデータフレームは変更されている
print(df)
A B
3 4.0 4.0
このように、inplace=True
を使用すると、元のデータが変更されてしまいます。
データの一部が意図せず削除されるケース
dropna関数
を使用する際には、削除の条件を正しく設定しないと、意図せずデータの一部が削除されることがあります。
特に、how
引数やsubset
引数を誤って設定すると、必要なデータまで削除される可能性があります。
以下の例では、how='all'
を指定した場合、すべての値がNaNである行のみが削除されるため、意図しない結果になることがあります。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, None, 3, None],
'B': [None, None, None, 4]
}
df = pd.DataFrame(data)
# 'all'を指定してNaNがすべての行を削除
df_cleaned = df.dropna(how='all')
print(df_cleaned)
A B
0 1.0 NaN
2 3.0 NaN
3 NaN 4.0
このように、how='all'
を指定した場合、NaNがすべての行が削除されず、意図しないデータが残ることがあります。
条件を慎重に設定することが重要です。
NaN以外の欠損値(Noneや空文字列)への対応
dropna関数
は、主にNaN(Not a Number)を対象としていますが、データフレームにはNoneや空文字列(”)など、他の形式の欠損値も存在することがあります。
これらの値はdropna
では削除されないため、必要に応じて別の方法で処理する必要があります。
以下は、空文字列を削除する方法の一例です。
import pandas as pd
# サンプルデータフレームの作成
data = {
'A': [1, '', 3, -1],
'B': [None, 2, '', 4],
'C': [5, 6, None, 8],
'D': [9, 10, 11, 12]
}
df = pd.DataFrame(data)
# NaNを含む行を削除
df_cleaned = df.dropna()
# 空文字列を含む行を削除
df_cleaned = df_cleaned[df_cleaned['A'] != '']
df_cleaned = df_cleaned[df_cleaned['B'] != '']
print(df_cleaned)
A B C D
3 -1 4 8.0 12
このように、NaN以外の欠損値に対しては、別途条件を設定して削除する必要があります。
データの特性を理解し、適切な処理を行うことが重要です。
まとめ
この記事では、Pandasのdropna関数
を使用して欠損値を削除する方法について詳しく解説しました。
具体的には、行や列単位での削除、引数の使い方、応用例、他の欠損値処理方法との比較、注意点などを取り上げました。
これらの知識を活用して、データ分析や前処理の際に適切な欠損値処理を行うことが重要です。
ぜひ、実際のデータセットに対してdropna関数
を試し、データのクリーンアップを行ってみてください。