DataFrame型オブジェクトからNaN値を削除するdropnaメソッドと、重複を削除するdrop_duplicatesメソッドの使い方についてまとめました。
目次
dropnaメソッドでNaN値を削除する方法
読み込んだデータに欠陥があったり、異なる長さのDataFrame型オブジェクトを結合すると、データが存在しない箇所はNaN値が挿入されます。
NaN値が存在すると計算に不具合が発生することがあるため、NaN値を削除しておく必要に迫られることがしばしばあります。 そのようなときは、dropnaメソッドを使用してNaN値を含む行または列を削除することができます。
故意にNaN値を持たせたDataFrame型オブジェクトを生成し、dropnaメソッドの使い方を整理していきます。
例:NaN値を含むDataFrame型オブジェクトの準備
import pandas as pd import numpy as np d = { "name":["musashi", "kojiro", "kouetsu", "inshun"], "arms":["katana", "katana", np.nan, "yari"], "age":[np.nan, 29, np.nan, 32], } df = pd.DataFrame(d) print(df)
出力:
name arms age 0 musashi katana NaN 1 kojiro katana 29.0 2 kouetsu NaN NaN 3 inshun yari 32.0
このDataFrame型オブジェクトを用いて、dropnaメソッドの使い方を確認していきます。
例:dropnaメソッドでNaN値を削除
df.dropna()
出力:
name arms age 1 kojiro katana 29.0 3 inshun yari 32.0
dropnaメソッドを実行することで、NaN値を持つすべての行が削除されました。
axisオプションを1(またはcolumns)に設定すると、NaN値を持つすべての「列」を削除することが可能です。
例:axisオプションでNaN値を持つ列を削除
df.dropna(axis=1)
または
df.dropna(axis="columns")
出力:
name 0 musashi 1 kojiro 2 kouetsu 3 inshun
NaN値を持つ列がすべて削除されました。
Howオプションをallに設定すると、要素がすべてNaN値の行のみを削除します。
例:すべてNaN値の行を削除
df.dropna(how="all")
出力:
name arms age 0 musashi katana NaN 1 kojiro katana 29.0 2 kouetsu NaN NaN 3 inshun yari 32.0
今回の例では、要素がすべてNaN値の行が存在しないので、そのままになります。
threshオプションで整数値を指定すると、その数以上のNaN値が行内にある場合のみ削除されます。
例:NaN値が二つ以上ある行を削除
df.dropna(thresh=2)
出力:
name arms age 0 musashi katana NaN 1 kojiro katana 29.0 3 inshun yari 32.0
NaN値が二つあるインデックス2の行が削除されました。
inplaceオプションをTrueに設定すると、元のオブジェクトにNaN値削除後のオブジェクトが上書きされます。
例:元のオブジェクトに上書き
df.dropna(inplace=True) print(df)
出力:
name arms age 1 kojiro katana 29.0 3 inshun yari 32.0
削除後のデータがdfに上書きされました。
drop_duplicatesメソッドで重複を削除する方法
大量のデータを読み込むと、重複したデータをいくつか読み込んでしまい、計算結果に影響を及ぼすことがあります。 そのようなときには、drop_duplicatesメソッドを用いて重複データを削除することができます。
故意に重複を持たせたDataFrame型オブジェクトを生成し、drop_duplicatesメソッドの使い方を整理していきます。
例:重複を含むDataFrame型オブジェクトの準備
import pandas as pd import numpy as np d = { "name":["musashi", "kojiro", "kouetsu", "inshun", "musashi"], "arms":["katana", "katana", np.nan, "yari", "katana"], "age":[np.nan, 29, np.nan, 32, np.nan], } df = pd.DataFrame(d) print(df)
出力:
name arms age 0 musashi katana NaN 1 kojiro katana 29.0 2 kouetsu NaN NaN 3 inshun yari 32.0 4 musashi katana NaN
インデックス0と4が重複データとなっています。
drop_duplicatesメソッドを用いて、このデータから重複データを削除していきます。
例:drop_duplicatesメソッドで重複データを削除
df.drop_duplicates()
出力:
name arms age 0 musashi katana NaN 1 kojiro katana 29.0 2 kouetsu NaN NaN 3 inshun yari 32.0
二つの重複データのうち、前方のデータが残り、後方のデータが削除されました。
keepオプションをlastに設定することで、重複データの後方のデータを残すことができます。
例:keepオプションで後方のデータを残して重複を削除
df.drop_duplicates(keep="last")
出力:
name arms age 1 kojiro katana 29.0 2 kouetsu NaN NaN 3 inshun yari 32.0 4 musashi katana NaN
前方の重複データが削除されました。
重複データのすべてを削除するには、keepオプションをFalseに設定します。
例:keepオプションで重複データをすべて削除
df.drop_duplicates(keep=False)
出力:
name arms age 1 kojiro katana 29.0 2 kouetsu NaN NaN 3 inshun yari 32.0
重複したデータの両方が削除されました。
inplaceオプションをTrueに設定すると、元のオブジェクトに重複データ削除後のオブジェクトが上書きされます。
例:元のオブジェクトに上書き
df.drop_duplicates(inplace=True) print(df)
出力:
name arms age 0 musashi katana NaN 1 kojiro katana 29.0 2 kouetsu NaN NaN 3 inshun yari 32.0
重複データ削除後のデータがdfに上書きされました。