表形式のデータを扱うのに便利なpandas.DataFrame
。
DataFrameで扱うデータには重複した要素を含んでいることがある。
重複データは場合によっては必要ないことがあるので、重複データがあるか確認して削除したい。
しかしどうやって重複行を検出して削除すればいいのか。
そこで今回はpandas.DataFrameで重複行を検出・削除する方法について紹介する。
この記事を書いている人
記事を読むメリット
pandas.DataFrameで重複行を検出・削除する方法がわかり、pandasで重複データを扱うのが苦手ではなくなる
pandas.DataFrameで重複行を検出・削除する方法
ではどのようにpandas.DataFrameで重複行を検出・削除するのか。
方法としては以下のようなものがある。
重複検出・削除方法
- 重複行の検出:
duplicated()
- 重複行の削除:
drop_duplicates()
それぞれ以下のデータを例に解説する。
DATA
import pandas as pd data_list1 = [ ["a",12,100], ["a",12,100], ["c",12,90], ["d",13,85], ["d",13,85], ["e",14,95] ] col_list1 = ["id","age","score"] df1 = pd.DataFrame(data=data_list1, columns=col_list1) print(df1) # id age score # 0 a 12 100 # 1 a 12 100 # 2 c 12 90 # 3 d 13 85 # 4 d 13 85 # 5 e 14 95
重複行の検出:duplicated()
重複行を検出するには duplicated()
を用いる。
duplicated()
を使用すると、各行に対するbool値が返ってくる。
重複している行のうち最初をオリジナルとしてそれ以外を重複行として判定している。
SAMPLE
print(df1.duplicated()) # 0 False # 1 True # 2 False # 3 False # 4 True # 5 False # dtype: bool
bool値でデータフレームをマスクすると、重複した行を抽出できる。
print(df1[df1.duplicated()]) # id age score # 1 a 12 100 # 4 d 13 85
残す行をkeepで指定
duplicated()
を引数無しで使用すると重複行のうち最初の行が False
として重複していない扱いになったが、 keep="last"
を指定すると最後の行を False
として残すことができる。
(デフォルトは keep="first"
)
SAMPLE
print(df1.duplicated(keep="last")) # 0 True # 1 False # 2 False # 3 True # 4 False # 5 False # dtype: bool print(df1[df1.duplicated(keep="last")]) # id age score # 0 a 12 100 # 3 d 13 85
ちなみに keep=False
にすると、重複行は最初も最後も全て重複扱いになる。
print(df1.duplicated(keep=False)) # 0 True # 1 True # 2 False # 3 True # 4 True # 5 False # dtype: bool print(df1[df1.duplicated(keep=False)]) # id age score # 0 a 12 100 # 1 a 12 100 # 3 d 13 85 # 4 d 13 85
重複を判定する列をsubsetで指定
duplicated()
でそのまま重複判定をすると全部の列の値が同じ行が重複と判定される。
ここで subset=["列名"]
で重複を判定する列を指定することもできる。
SAMPLE
print(df1.duplicated(subset=["age"])) # 0 False # 1 True # 2 True # 3 False # 4 True # 5 False # dtype: bool print(df1[df1.duplicated(subset=["age"])]) # id age score # 1 a 12 100 # 2 c 12 90 # 4 d 13 85
重複行の削除:drop_duplicates()
重複行を削除したい場合は drop_duplicates()
を用いる。
SAMPLE
print(df1.drop_duplicates()) # id age score # 0 a 12 100 # 2 c 12 90 # 3 d 13 85 # 5 e 14 95
処理内容としては duplicated()
で得られたbool値を反転させてマスクすることで「重複していない行」を抽出するのと変わらない。
print(df1[~df1.duplicated()]) # id age score # 0 a 12 100 # 2 c 12 90 # 3 d 13 85 # 5 e 14 95
ちなみに duplicated()
と同じように keep
と subset
は引数として使用可能だ。
元のデータフレームを変更するにはinplaceを指定
drop_duplicates()
をしても返り値は別のデータフレームとして返ってくる。
元のデータフレームそのものを変更したい場合は inplace=True
を指定すると元のデータフレームに重複削除が反映される。
SAMPLE
df1.drop_duplicates() print(df1) # id age score # 0 a 12 100 # 1 a 12 100 # 2 c 12 90 # 3 d 13 85 # 4 d 13 85 # 5 e 14 95 df1.drop_duplicates(inplace=True) print(df1) # id age score # 0 a 12 100 # 2 c 12 90 # 3 d 13 85 # 5 e 14 95
まとめ
今回はpandas.DataFrameで重複行を検出・削除する方法について説明した。
pandas.DataFrameで重複行を検出・削除するには以下のような方法がある。
重複検出・削除方法
- 重複行の検出:
duplicated()
- 重複行の削除:
drop_duplicates()
それぞれ keep="first"
や keep="last"
で重複している行のうちどこをオリジナル扱いするかを指定でき、subset=["列名"]
で重複を判定する列を指定することもできる。
他にもpandas関連の記事もあるので、もし気になったら見てみて欲しい。