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ドキュメント
