pandasのデータフレームから重複行を削除する

前回の記事が重複行の抽出だったので今回は重複行の削除です。
参考:pandasのデータフレームの重複行を抽出する

このあと専用の関数を紹介しますが、
重複行の抽出条件を反転させればできてしまうので、この書き方でも構わないと思います。
print(df[~df.duplicated()])
(むしろ、duplicated関数の引数keepの意味はこちらの方がわかりやすい。)


import pandas as pd
import numpy as np

# データの作成
df = pd.DataFrame(
        {
            "col0": np.random.choice(["A", "B", "C"], size=10),
            "col1": np.random.choice(["a", "b", "c"], size=10),
            "col2": np.random.choice(["1", "2", "3"], size=10),
        }
    )
# データの確認
print(df)
'''
  col0 col1 col2
0    C    a    1
1    B    a    2
2    A    c    3
3    B    c    1
4    B    a    2
5    C    a    1
6    C    b    2
7    B    a    2
8    C    c    3
9    C    c    3
'''
# duplicated()の結果を反転させると重複していない行を抽出できる。
print(df[~df.duplicated()])
'''
  col0 col1 col2
0    C    a    1
1    B    a    2
2    A    c    3
3    B    c    1
6    C    b    2
8    C    c    3
'''

pandasには重複行削除専用のメソッドとして、drop_duplicatesが定義されています。
ドキュメントはこちら。
pandas.DataFrame.drop_duplicates

引数の keep と subset は duplicated と同じように使えます。
また、inplace に Trueを指定することで、そのデータフレームの値自体を書き換えます。
デフォルトはFalseで、重複行を削除した結果を返します。


print(df.drop_duplicates())
'''
  col0 col1 col2
0    C    a    1
1    B    a    2
2    A    c    3
3    B    c    1
6    C    b    2
8    C    c    3
'''

先ほどの結果と同じもののが得られましたね。

pandasの実装を見るとわかるのですが、ただのラッパーなので、
とくにこちらの方が実行速度が速いといったことはなさそうです。
https://github.com/pandas-dev/pandas/blob/v0.24.2/pandas/core/frame.py#L4605-L4637

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です