ウェブサイト検索

Python pandasのdropna()を使ってDataFrameからNA値を削除する方法


紹介

このチュートリアルでは、pandasのDataFrameのdropna()関数の使い方を学びます。

NAの値は「利用不可」を意味します。これはNull、None、pandas.NaT、またはnumpy.nanに適用されます。dropna()を使用すると、これらの値を含む行と列が削除されます。これにより、有効なデータのみを提供することができます。

デフォルトでは、この関数は新しいデータフレームを返し、元のデータフレームは変更されません。

このチュートリアルは、Python 3.10.9、pandas 1.5.2、およびNumPy 1.24.1で確認されました。

構文

dropna() は次のパラメータを取ります:

dropna(self, axis=0, how="any", thresh=None, subset=None, inplace=False)
  • 軸: {0(または 'index')、1(または 'columns')}, デフォルトは0
  • もし0の場合、欠損値のある行を削除します。
  • もし1の場合、欠損値のある列を削除します。
  • 方法: {'任意', 'すべて'}, デフォルトは '任意'
  • もし'any'の場合、値のいずれかがNAであれば、行または列を削除してください。
  • 「すべて」であれば、すべての値がNAである場合は行または列を削除します。
  • thresh: (オプション)ドロップ操作のしきい値を指定するためのint値。
  • subset: (オプション) 行または列を指定するための列ラベルまたはラベルのシーケンス。
  • inplace: (オプション)bool値。
  • Trueの場合、ソースのDataFrameは変更され、Noneが返されます。

サンプルデータフレームの構築

有効な値と無効な値を含むサンプルDataFrameを構築します:

import pandas as pd
import numpy as np

d1 = {
'Name': ['Shark', 'Whale', 'Jellyfish', 'Starfish'],
'ID': [1, 2, 3, 4],
'Population': [100, 200, np.nan, pd.NaT],
'Regions': [1, None, pd.NaT, pd.NaT]
}

df1 = pd.DataFrame(d1)
print(df1)

このコードはDataFrameを出力します:

Name ID Population Regions
0 Shark 1 100 1
1 Whale 2 200 None
2 Jellyfish 3 NaN NaT
3 Starfish 4 NaT NaT

次に、NA 値を持つ追加の行と列を持つ2番目のDataFrameを追加します:

d2 = {
'Name': ['Shark', 'Whale', 'Jellyfish', 'Starfish', pd.NaT],
'ID': [1, 2, 3, 4, pd.NaT],
'Population': [100, 200, np.nan, pd.NaT, pd.NaT],
'Regions': [1, None, pd.NaT, pd.NaT, pd.NaT],
'Endangered': [pd.NaT, pd.NaT, pd.NaT, pd.NaT, pd.NaT]
}

df2 = pd.DataFrame(d2)
print(df2)

これにより新しいDataFrameが出力されます:

Name ID Population Regions Endangered
0 Shark 1 100 1 NaT
1 Whale 2 200 None NaT
2 Jellyfish 3 NaN NaT NaT
3 Starfish 4 NaT NaT NaT
4 NaT NaT NaT NaT NaT

次の例では、前のデータフレームを使用します。

欠損値のある行をすべて削除する

dropna() を使用して、None、NaN、または NaT の値を持つ行を削除します。

dfresult = df1.dropna()
print(dfresult)

これは出力されます:

Name ID Population Regions
0 Shark 1 100 1

NA値を含まない単一行の新しいデータフレーム。

欠損値のあるすべての列を削除する

dropna()をaxis=1と共に使用して、None、NaN、またはNaTの値が含まれる列を削除します:

dfresult = df1.dropna(axis=1)
print(dfresult)

値が None、NaN、または NaT である列は削除されます:

Name ID
0 Shark 1
1 Whale 2
2 Jellyfish 3
3 Starfish 4

非NA値を含む単一列の新しいデータフレーム。

howを使って、すべての値がNullである行または列を削除する

2番目のデータフレームとhowを使用してください:

dfresult = df2.dropna(how='all')
print(dfresult)

すべての値がNAに等しい行は削除されます:

Name ID Population Regions Endangered
0 Shark 1 100 1 NaT
1 Whale 2 200 None NaT
2 Jellyfish 3 NaN NaT NaT
3 Starfish 4 NaT NaT NaT

5行目が削除されました。

次に、howを使用し、axisを指定します:

dfresult = df2.dropna(how='all', axis=1)
print(dfresult)

すべての値がNAに等しい列は削除されます:

Name ID Population Regions
0 Shark 1 100 1
1 Whale 2 200 None
2 Jellyfish 3 NaN NaT
3 Starfish 4 NaT NaT
4 NaT NaT NaT NaT

第五列が削除されました。

しきい値が超えた場合に行または列を削除するにはthreshを使用します。

2番目のDataFrameを使用して、少なくとも3つの非NA値を満たさない行を削除するには、threshを使用します:

dfresult = df2.dropna(thresh=3)
print(dfresult)

行には少なくとも3つの非NAがない場合は、削除されます:

Name ID Population Regions Endangered
0 Shark 1 100 1 NaT
1 Whale 2 200 None NaT

三列目、四列目、五列目が削除されました。

特定のサブセットに対して行または列を削除する

第二のDataFrameを使用して、Population列にNA値がある行を削除するには、subsetを使います。

dfresult = df2.dropna(subset=['Population'])
print(dfresult)

値がNAであるPopulationを持つ行は削除されます。

Name ID Population Regions Endangered
0 Shark 1 100 1 NaT
1 Whale 2 200 None NaT

三列目、四列目、五列目が削除されました。

データフレームから列を削除する際に、subset内でindex値を指定することもできます:

dfresult = df2.dropna(subset=[1, 2], axis=1)
print(dfresult)

行1と2のサブセットにNA値を含む列:

Name ID
0 Shark 1
1 Whale 2
2 Jellyfish 3
3 Starfish 4
4 NaT NaT

三列目、四列目、および五列目が削除されました。

行や列を削除した後にデータフレームのソースを変更するには、inplaceを使用します。

デフォルトでは、dropna()は元のDataFrameを変更しません。しかし、大きな元のDataFrameを扱う際には、inplaceを使用してメモリを節約したい場合があります。

df1.dropna(inplace=True)
print(df1)

このコードは dfresult 変数を使用していません。

これは出力されます:

Name ID Population Regions
0 Shark 1 100 1

元のデータフレームが修正されました。

結論

この記事では、NA 値を含む行や列を削除するために dropna() 関数を使用しました。

さらなるPythonとpandasのチュートリアルで学びを続けましょう - Python pandasモジュールチュートリアル、pandasの重複行を削除する方法。

参考文献

  • pandasのDataFrame dropna() APIドキュメント

関連記事: