pythonのDataFrameで指定した列で重複行を確認する方法

データパイプライン構築をしている際に、ある列を除いて他の列の値が重複している事象がありました。その際にDataFrameのduplicated()を使用しました。

サンプルコード

import pandas as pd

# 辞書型のリストでデータを作成
dict_list = [{'store_num':'00001', 'category_l':'100', 'category_m':'10', 'category_s':'1', 'item_num':'AAA', 'qty':10, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00001', 'category_l':'100', 'category_m':'10', 'category_s':'1', 'item_num':'AAA', 'qty':100, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00002', 'category_l':'200', 'category_m':'20', 'category_s':'1', 'item_num':'BBB', 'qty':20, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00002', 'category_l':'200', 'category_m':'20', 'category_s':'1', 'item_num':'BBB', 'qty':200, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00002', 'category_l':'200', 'category_m':'20', 'category_s':'1', 'item_num':'BBB', 'qty':2000, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00003', 'category_l':'100', 'category_m':'10', 'category_s':'1', 'item_num':'CCC', 'qty':30, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'}]

df = pd.DataFrame(dict_list)

# 列のリストを作成
# column_list = df.columns.tolist()

# qty以外で重複がある行をSeries型で確認
series_duplicated_sub = df.duplicated(subset= ['store_num', 'category_l', 'category_m', 'category_s', 'item_num', 'delivery_day', 'delivery_cnt', 'rgdt'], keep=False)
display(series_duplicated_sub)
print(type(series_duplicated_sub))

# qty以外で重複がある行をDataFrameで確認
df_duplicated_sub = df[df.duplicated(subset= ['store_num', 'category_l', 'category_m', 'category_s', 'item_num', 'delivery_day', 'delivery_cnt', 'rgdt'], keep=False)]
display(df_duplicated_sub)
print(type(df_duplicated_sub))

作成したDataFrame


store_num category_l category_m category_s item_num qty delivery_day delivery_cnt rgdt
0 00001 100 10 1 AAA 10 2024-05-01 1 2024-04-29
1 00001 100 10 1 AAA 100 2024-05-01 1 2024-04-29
2 00002 200 20 1 BBB 20 2024-05-01 1 2024-04-29
3 00002 200 20 1 BBB 200 2024-05-01 1 2024-04-29
4 00002 200 20 1 BBB 2000 2024-05-01 1 2024-04-29
5 00003 100 10 1 CCC 30 2024-05-01 1 2024-04-29

<class 'pandas.core.frame.DataFrame'>

※指定した列ごとに重複行をカウントする方法はこちらで解説しております。

※重複行の総数をカウントする方法はこちらで解説しております。

サンプルコード解説

qty以外で重複がある行をSeries型で確認

# qty以外で重複があるか確認
series_duplicated_sub = df.duplicated(subset= ['store_num', 'category_l', 'category_m', 'category_s', 'item_num', 'delivery_day', 'delivery_cnt', 'rgdt'], keep=False)
display(series_duplicated_sub)
print(type(series_duplicated_sub))

結果

0     True
1     True
2     True
3     True
4     True
5    False
dtype: bool
<class 'pandas.core.series.Series'>

結果はSeries型で返ってきます。引数のsubsetにグループ化したい列名をリスト形式で指定します。この時、「column_list = df.columns.tolist()」で列名を取得し、不要な列を消す方がミスが減るのでよいです。keep=Falseにすると重複している行の値がすべてTrueになります。keepを指定しない場合は重複している最初の行を除いた行がすべてTrueとなります。以下、比較用のコードです。

# qty以外で重複があるか確認
series_duplicated_sub = df.duplicated(subset= ['store_num', 'category_l', 'category_m', 'category_s', 'item_num', 'delivery_day', 'delivery_cnt', 'rgdt'])
display(series_duplicated_sub)
print(type(series_duplicated_sub))

結果

0    False
1     True
2    False
3     True
4     True
5    False
dtype: bool
<class 'pandas.core.series.Series'>

qty以外で重複がある行をDataFrameで確認

df_duplicated_sub = df[df.duplicated(subset= ['store_num', 'category_l', 'category_m', 'category_s', 'item_num', 'delivery_day', 'delivery_cnt', 'rgdt'], keep=False)]
display(df_duplicated_sub)
print(type(df_duplicated_sub))

結果

	store_num	category_l	category_m	category_s	item_num	qty	delivery_day	delivery_cnt	rgdt
0 00001 100 10 1 AAA 10 2024-05-01 1 2024-04-29
1 00001 100 10 1 AAA 100 2024-05-01 1 2024-04-29
2 00002 200 20 1 BBB 20 2024-05-01 1 2024-04-29
3 00002 200 20 1 BBB 200 2024-05-01 1 2024-04-29
4 00002 200 20 1 BBB 2000 2024-05-01 1 2024-04-29

<class 'pandas.core.frame.DataFrame'>

keepを指定しない場合は重複している最初の行がFalseとなります。以下、比較用のコードです。

# qty以外で重複があるか確認
df_duplicated_sub_no_keep = df[df.duplicated(subset= ['store_num', 'category_l', 'category_m', 'category_s', 'item_num', 'delivery_day', 'delivery_cnt', 'rgdt'])]
display(df_duplicated_sub_no_keep)
print(type(df_duplicated_sub_no_keep))

結果

	store_num	category_l	category_m	category_s	item_num	qty	delivery_day	delivery_cnt	rgdt
1 00001 100 10 1 AAA 100 2024-05-01 1 2024-04-29
3 00002 200 20 1 BBB 200 2024-05-01 1 2024-04-29
4 00002 200 20 1 BBB 2000 2024-05-01 1 2024-04-29

<class 'pandas.core.frame.DataFrame'>

コメント

タイトルとURLをコピーしました