데이터프레임에서 각 행은 분석 대상이 갖고 있는 모든 속성(변수)에 대한 관측값(record)을 뜻한다. 하나의 데이터셋에서 동일한 관측값이 2개 이상 중복되는 경우 중복 데이터를 찾아서 삭제해야한다. 분석결과를 왜곡 하기 때문이다.

중복 데이터 확인

duplicated() : 중복여부 확인

duplicated() 메서드는 전에 나온 행과 비교해서 중복되는 행이라면 True를 리턴한다. 데이터프레임에 사용하면 각 행의 중복 여부를 확인하는 boolen 시리즈를 반환한다.

import pandas as pd

df = pd.DataFrame({
    'c1': ['a', 'a', 'b', 'a', 'b'],
    'c2': [1, 1, 1, 2, 2],
    'c3': [1, 1, 2, 2, 2]
})

print(df)
print()

df_dup = df.duplicated()
print(df_dup)
	c1  c2  c3
0  a   1   1
1  a   1   1
2  b   1   2
3  a   2   2
4  b   2   2

0    False
1     True
2    False
3    False
4    False
dtype: bool

첫째항은 중복을 확인할 행이 없으므로 당연히 False를 리턴하다. 1행에서는 0행과 비교하여 중복이므로 True를 리턴한다.

데이터프레임의 열에도 똑같이 사용할 수 있다.

import pandas as pd

df = pd.DataFrame({
    'c1': ['a', 'a', 'b', 'a', 'b'],
    'c2': [1, 1, 1, 2, 2],
    'c3': [1, 1, 2, 2, 2]
})

print(df)
print()

col_dup = df['c2'].duplicated()
print(col_dup)
	c1  c2  c3
0  a   1   1
1  a   1   1
2  b   1   2
3  a   2   2
4  b   2   2

0    False
1     True
2     True
3    False
4     True
Name: c2, dtype: bool

'c2'열에 대해서 중복을 검사했다. 1행, 2행, 4행이 중복값이라는 것을 알 수 있다.

중복 데이터 제거

drop_duplicates() : 중복 데이터 제거

import pandas as pd

df = pd.DataFrame({
    'c1': ['a', 'a', 'b', 'a', 'b'],
    'c2': [1, 1, 1, 2, 2],
    'c3': [1, 1, 2, 2, 2]
})

print(df)
print()

df2 = df.drop_duplicates()
print(df2)
	c1  c2  c3
0  a   1   1
1  a   1   1
2  b   1   2
3  a   2   2
4  b   2   2

  c1  c2  c3
0  a   1   1
2  b   1   2
3  a   2   2
4  b   2   2

subset 옵션에 열 이름의 리스트를 전달할 수 있다.

import pandas as pd

df = pd.DataFrame({
    'c1': ['a', 'a', 'b', 'a', 'b'],
    'c2': [1, 1, 1, 2, 2],
    'c3': [1, 1, 2, 2, 2]
})

print(df)
print()

df2 = df.drop_duplicates(subset='c2')
print(df2)
	c1  c2  c3
0  a   1   1
1  a   1   1
2  b   1   2
3  a   2   2
4  b   2   2

  c1  c2  c3
0  a   1   1
3  a   2   2