行で値が重複しているか検出
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

コメント