Pandasの値が重複した行の検出や件数、抽出、削除

スポンサーリンク
スポンサーリンク

行で値が重複しているか検出

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

 

コメント

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