Pandas

[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関数は欠損値を含む行や列を削除します。

以下にそれぞれの特徴を示します。

メソッド概要使用例
dropnaNaNを含む行や列を削除df.dropna()
fillnaNaNを特定の値や方法で埋める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は欠損値を含む行や列を削除します。

以下にそれぞれの特徴を示します。

メソッド概要使用例
dropnaNaNを含む行や列を削除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関数を試し、データのクリーンアップを行ってみてください。

関連記事

Back to top button