前回の記事が重複行の抽出だったので今回は重複行の削除です。
参考: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