Python Code Notes

Information by python engineer

pandas DataFrame型オブジェクトからNaN値、重複を削除する方法(dropnaとdrop_duplicates) Python

f:id:vigilantPotato:20190618225252p:plain

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に上書きされました。