行で値が重複しているか検出
df.duplicated()
- 全ての列で重複しているか検出します。
- 重複している場合はTrue、していない場合はFalseとなる。
df.duplicated(subset='列名')
- 指定した列名(カラム)で重複しているか検出します。
- 列名(カラム)はリスト形式で複数列の指定が可能です。
- 重複している場合はTrue、していない場合はFalseとなる。
列のdtypeがboolのときはうまく動作しないようです。
df = pd.DataFrame( [ ["2020/05/01 12:34:56",1,True], ["2020/05/01 12:34:56",2,True], ["2020/05/01 16:34:56",1,True], ["2020/05/01 20:34:56",4,False], ], columns = ["DateTime", "aaa", "bbb"] ) df['DateTime'] = pd.to_datetime(df['DateTime']) print(df) # DateTime aaa bbb # 0 2020-05-01 12:34:56 1 True # 1 2020-05-01 12:34:56 2 True # 2 2020-05-01 16:34:56 1 True # 3 2020-05-01 20:34:56 4 False print(df.duplicated()) # 0 False # 1 False # 2 False # 3 False # dtype: bool print(df.duplicated(subset='DateTime')) # 0 False # 1 True # 2 False # 3 False # dtype: bool print(df.duplicated(subset='aaa')) # 0 False # 1 False # 2 True # 3 False # dtype: bool print(df.duplicated(subset='bbb')) # 0 False # 1 True # 2 True # 3 False # dtype: bool
値が重複している行の件数を取得
df.duplicated().value_counts()
- 全ての列で重複している件数を表示します。
df.duplicated(subset='列名').value_counts()
- 指定した列名(カラム)で重複している件数を表示します。
- 列名(カラム)はリスト形式で複数列の指定が可能です。
df = pd.DataFrame( [ ["2020/05/01 12:34:56",1,True], ["2020/05/01 12:34:56",2,True], ["2020/05/01 16:34:56",1,False] ], columns = ["DateTime", "aaa", "bbb"] ) df['DateTime'] = pd.to_datetime(df['DateTime']) print(df) # DateTime aaa bbb # 0 2020-05-01 12:34:56 1 True # 1 2020-05-01 12:34:56 2 True # 2 2020-05-01 16:34:56 1 False print(df.duplicated().value_counts()) # False 3 # dtype: int64 print(df.duplicated(subset='DateTime').value_counts()) # False 2 # True 1 # dtype: int64 print(df.duplicated(subset='aaa').value_counts()) # False 2 # True 1 # dtype: int64 print(df.duplicated(subset='bbb').value_counts()) # False 2 # True 1 # dtype: int64
値が重複している行を抽出
df[df.duplicated()]
- 全ての列で重複している行を抽出します。
df[df.duplicated(subset=’列名’)]
- 指定した列名(カラム)で重複している行を抽出します。
- 列名(カラム)はリスト形式で複数列の指定が可能です。
列のdtypeがboolのときはうまく動作しないようです。
抽出した行は、df = df[df.duplicated(subset='列名')]
のように代入を忘れないようにしましょう。
df = pd.DataFrame( [ ["2020/05/01 12:34:56",1,True], ["2020/05/01 12:34:56",2,True], ["2020/05/01 16:34:56",1,True], ["2020/05/01 20:34:56",4,False], ], columns = ["DateTime", "aaa", "bbb"] ) df['DateTime'] = pd.to_datetime(df['DateTime']) print(df) # DateTime aaa bbb # 0 2020-05-01 12:34:56 1 True # 1 2020-05-01 12:34:56 2 True # 2 2020-05-01 16:34:56 1 True # 3 2020-05-01 20:34:56 4 False print(df[df.duplicated()]) # dtype: bool # Empty DataFrame # Columns: [DateTime, aaa, bbb] # Index: [] print(df[df.duplicated(subset='DateTime')]) # DateTime aaa bbb # 1 2020-05-01 12:34:56 2 True
値が重複している行を削除(重複していない行を抽出)
df.drop_duplicates()
- 全ての列で重複している行を削除します。
df[~df.duplicated()]
と同じ処理になります。
df.drop_duplicates(subset='列名')
- 指定した列名(カラム)で重複している行を削除します。
- 列名(カラム)はリスト形式で複数列の指定が可能です。
df[~df.duplicated(subset='列名')]
と同じ処理になります。
削除した行は、df = df.drop_duplicates(subset='列名')
のように代入を忘れないようにしましょう。
import pandas as pd df = pd.DataFrame( [ ["2020/05/01 12:34:56",1,True], ["2020/05/01 12:34:56",1,True], ["2020/05/01 16:34:56",1,False], ["2020/05/01 20:34:56",4,False], ], columns = ["DateTime", "aaa", "bbb"] ) df['DateTime'] = pd.to_datetime(df['DateTime']) print(df) # DateTime aaa bbb # 0 2020-05-01 12:34:56 1 True # 1 2020-05-01 12:34:56 2 True # 2 2020-05-01 16:34:56 1 True # 3 2020-05-01 20:34:56 4 False print(df.drop_duplicates()) # DateTime aaa bbb # 0 2020-05-01 12:34:56 1 True # 2 2020-05-01 16:34:56 1 True # 3 2020-05-01 20:34:56 4 False print(df.drop_duplicates(subset='bbb')) # DateTime aaa bbb # 0 2020-05-01 12:34:56 1 True # 2 2020-05-01 16:34:56 1 False
複数の列を指定した場合
subset
でリスト形式で列名(カラム名)を指定することにより複数列を指定することが可能です。
複数列を指定した場合は、and
になり、指定した列の全てで重複しているかチェックします。
df = pd.DataFrame( [ ["2020/05/01 12:34:56",1,True], ["2020/05/01 12:34:56",1,True], ["2020/05/01 16:34:56",1,False], ["2020/05/01 20:34:56",4,False], ], columns = ["DateTime", "aaa", "bbb"] ) df['DateTime'] = pd.to_datetime(df['DateTime']) print(df) # DateTime aaa bbb # 0 2020-05-01 12:34:56 1 True # 1 2020-05-01 12:34:56 2 True # 2 2020-05-01 16:34:56 1 True # 3 2020-05-01 20:34:56 4 False print(df.drop_duplicates(subset='aaa')) # DateTime aaa bbb # 0 2020-05-01 12:34:56 1 True # 3 2020-05-01 20:34:56 4 False print(df.drop_duplicates(subset=['aaa', 'bbb'])) # DateTime aaa bbb # 0 2020-05-01 12:34:56 1 True # 2 2020-05-01 16:34:56 1 False # 3 2020-05-01 20:34:56 4 False
コメント