달나라 노트

Python Pandas : duplicated (중복값 확인하기) 본문

Python/Python Pandas

Python Pandas : duplicated (중복값 확인하기)

CosmosProject 2021. 8. 31. 23:08
728x90
반응형

 

 

 

 

Python pandas에는 duplicated라는 method가 있습니다.

duplicated method는 DataFrame에 있는 행들 중 중복된 값을 가진 행이 뭔지 True, False의 형태로 알려줍니다.

 

 

Syntax

DataFrame.duplicated(subset=list/none, keep='first'/'last'/False)

subset

subset에는 중복값 테스트를 할 기준 column을 적습니다.

만약 subset을 적지 않으면 모든 컬럼의 데이터를 기준으로 중복값을 가진 row를 체크합니다.

 

keep='first' --> 중복된 row 중에서 가장 위에 있는 row를 제외하고 나머지 row에 중복 flag(True)를 달아줍니다.

keep='last' --> 중복된 row 중에서 가장 아래에 있는 row를 제외하고 나머지 row에 중복 flag(True)를 달아줍니다.

keep=False --> 중복된 모든 row에 중복 flag를 달아줍니다.

 

 

 

 

 

 

 

 

 

import pandas as pd

dict_1 = {
    'item_id': [1, 1, 2, 2, 2, 2, 3, 4],
    'company': ['A', 'A', 'B', 'B', 'B', 'C', 'A', 'C'],
    'item_name': ['apple', 'apple', 'banana', 'banana', 'banana', 'banana', 'grape', 'watermelon'],
    'price': [15000, 15000, 4750, 4750, 4750, 4200, 13000, 18000],
    'color': ['red', 'red', 'yellow', 'yellow', 'yellow', 'yellow', 'purple', 'green']
}

df_1 = pd.DataFrame(dict_1)
print(df_1)




-- Result
   item_id company   item_name  price   color
0        1       A       apple  15000     red
1        1       A       apple  15000     red
2        2       B      banana   4750  yellow
3        2       B      banana   4750  yellow
4        2       B      banana   4750  yellow
5        2       C      banana   4200  yellow
6        3       A       grape  13000  purple
7        4       C  watermelon  18000   green

먼저 위처럼 test용 DataFrame을 생성해줍시다.

 

 

 

 

 

 

import pandas as pd

dict_1 = {
    'item_id': [1, 1, 2, 2, 2, 2, 3, 4],
    'company': ['A', 'A', 'B', 'B', 'B', 'C', 'A', 'C'],
    'item_name': ['apple', 'apple', 'banana', 'banana', 'banana', 'banana', 'grape', 'watermelon'],
    'price': [15000, 15000, 4750, 4750, 4750, 4200, 13000, 18000],
    'color': ['red', 'red', 'yellow', 'yellow', 'yellow', 'yellow', 'purple', 'green']
}

df_1 = pd.DataFrame(dict_1)
print(df_1)

df_duplicated_info = df_1.duplicated()
print(df_duplicated_info)
print(type(df_duplicated_info))



-- Result
   item_id company   item_name  price   color
0        1       A       apple  15000     red
1        1       A       apple  15000     red
2        2       B      banana   4750  yellow
3        2       B      banana   4750  yellow
4        2       B      banana   4750  yellow
5        2       C      banana   4200  yellow
6        3       A       grape  13000  purple
7        4       C  watermelon  18000   green

0    False
1     True
2    False
3     True
4     True
5    False
6    False
7    False
dtype: bool

<class 'pandas.core.series.Series'>

위 예시를 봅시다.

df_1에 duplicated method를 적용하였습니다.

duplicated method에는 아무 parameter를 적지 않았으므로 모든 컬럼의 값이 동일해야만 중복된 row로 판단됩니다.

또한 keep option은 기본값인 'first'로 적용됩니다.

 

중복된 row가 뭐가있는지 살펴봅시다.

index = 0, 1 --> 이 2개의 row는 모든 컬럼의 값이 동일하므로 중복된 행입니다.

index = 2, 3, 4 --> 이 2개의 row는 모든 컬럼의 값이 동일하므로 중복된 행입니다.

 

그 외 나머지 row들은 중복된 값이 없습니다.

 

 

 

결과를 보면 bool값을 가진 Series의 형태로 결과가 return됩니다.

 

index = 0 --> False

index = 1 --> True

먼저 위 부분을 보면 중복되는 2개의 row 중에서 가장 위에있는 index=0인 row는 False, 나머지 row인 index=1은 True라고 표시되었습니다.

 

True라는 것이 중복되는 행이다 라는 의미이며

duplicated의 keep option이 기본값인 first로 적용되므로 가장 위쪽의 행을 제외한 나머지 행에 중복 flag(True)를 달아준겁니다.

 

 

 

 

index = 2 --> False

index = 3 --> True

index = 4 --> True

이제 위 부분을 봅시다.

중복되는 3개의 row 중에서 가장 위에 있는 index=2인 row는 False, 그리고 나머지 row는 True로 표시되어있습니다.

이는 마찬가지로 keep option이 default값인 first로 적용되므로 가장 위쪽의 행을 제외한 나머지 행에 중복 flag(True)를 달아준겁니다.

 

 

 

 

 

 

 

 

 

import pandas as pd

dict_1 = {
    'item_id': [1, 1, 2, 2, 2, 2, 3, 4],
    'company': ['A', 'A', 'B', 'B', 'B', 'C', 'A', 'C'],
    'item_name': ['apple', 'apple', 'banana', 'banana', 'banana', 'banana', 'grape', 'watermelon'],
    'price': [15000, 15000, 4750, 4750, 4750, 4200, 13000, 18000],
    'color': ['red', 'red', 'yellow', 'yellow', 'yellow', 'yellow', 'purple', 'green']
}

df_1 = pd.DataFrame(dict_1)
print(df_1)

df_duplicated_info = df_1.duplicated(keep='last')
print(df_duplicated_info)
print(type(df_duplicated_info))




-- Result
   item_id company   item_name  price   color
0        1       A       apple  15000     red
1        1       A       apple  15000     red
2        2       B      banana   4750  yellow
3        2       B      banana   4750  yellow
4        2       B      banana   4750  yellow
5        2       C      banana   4200  yellow
6        3       A       grape  13000  purple
7        4       C  watermelon  18000   green

0     True
1    False
2     True
3     True
4    False
5    False
6    False
7    False
dtype: bool

<class 'pandas.core.series.Series'>

이번 예시에서는 keep option을 last로 지정해보았습니다.

last의 의미는 중복되는 row들의 세트 중에서 가장 아래에 있는 row를 제외한 나머지 row에 중복 flag(True)를 달아주라는 뜻입니다.

따라서 바로 이전에 봤던 예시와 비교했을 때 중복되는 row에 대한 Ture, False값이 반전되었음을 알 수 있죠.

 

 

 

 

 

 

 

 

 

 

import pandas as pd

dict_1 = {
    'item_id': [1, 1, 2, 2, 2, 2, 3, 4],
    'company': ['A', 'A', 'B', 'B', 'B', 'C', 'A', 'C'],
    'item_name': ['apple', 'apple', 'banana', 'banana', 'banana', 'banana', 'grape', 'watermelon'],
    'price': [15000, 15000, 4750, 4750, 4750, 4200, 13000, 18000],
    'color': ['red', 'red', 'yellow', 'yellow', 'yellow', 'yellow', 'purple', 'green']
}

df_1 = pd.DataFrame(dict_1)
print(df_1)

df_duplicated_info = df_1.duplicated(keep=False)
print(df_duplicated_info)
print(type(df_duplicated_info))




-- Result
   item_id company   item_name  price   color
0        1       A       apple  15000     red
1        1       A       apple  15000     red
2        2       B      banana   4750  yellow
3        2       B      banana   4750  yellow
4        2       B      banana   4750  yellow
5        2       C      banana   4200  yellow
6        3       A       grape  13000  purple
7        4       C  watermelon  18000   green

0     True
1     True
2     True
3     True
4     True
5    False
6    False
7    False
dtype: bool

<class 'pandas.core.series.Series'>

keep option을 False로 설정하면 중복된 모든 행에 중복 flag(True)를 달아줍니다.

그래서 위 예시를 보면

index = 0, 1이 중복되는 row이기 때문에 index = 0, 1행에 모두 True라고 달아주었으며,

index = 2, 3, 4가 중복되는 row이기 때문에 index = 2, 3, 4행에 모두 True라고 달아주었습니다.

 

 

 

 

 

 

 

 

 

import pandas as pd

dict_1 = {
    'item_id': [1, 1, 2, 2, 2, 2, 3, 4],
    'company': ['A', 'A', 'B', 'B', 'B', 'C', 'A', 'C'],
    'item_name': ['apple', 'apple', 'banana', 'banana', 'banana', 'banana', 'grape', 'watermelon'],
    'price': [15000, 15000, 4750, 4750, 4750, 4200, 13000, 18000],
    'color': ['red', 'red', 'yellow', 'yellow', 'yellow', 'yellow', 'purple', 'green']
}

df_1 = pd.DataFrame(dict_1)
print(df_1)

df_duplicated_info = df_1.duplicated(subset=['item_id', 'item_name'], keep=False)
print(df_duplicated_info)
print(type(df_duplicated_info))



-- Result
   item_id company   item_name  price   color
0        1       A       apple  15000     red
1        1       A       apple  15000     red
2        2       B      banana   4750  yellow
3        2       B      banana   4750  yellow
4        2       B      banana   4750  yellow
5        2       C      banana   4200  yellow
6        3       A       grape  13000  purple
7        4       C  watermelon  18000   green

0     True
1     True
2     True
3     True
4     True
5     True
6    False
7    False
dtype: bool

<class 'pandas.core.series.Series'>

위 예시는 subset을 따로 지정하였습니다.

subset을 적지 않으면 DataFrame에 있는 모든 컬럼의 값이 동일한 row들끼리 중복 체크를 합니다.

즉, 컬럼이 5개 있다면 이 모든 5개의 값이 동일해야 중복된 row라고 판단한다는 것이지요.

 

하지만 위처럼 subset을 지정해주면 subset에 적힌 컬럼의 데이터만 중복 체크 고려대상입니다.

위 예시에선 item_id, item_name을 subset에 적어주었습니다.

따라서 다른 컬럼의 값이 다르건 같건 상관없이 item_id, item_name 이 2개의 컬럼만 고려해서 이 2개의 컬럼 값만 동일하면 중복된 row라고 판단합니다.

 

index = 0, 1 --> 이 2개의 row는 서로 동일한 item_id, item_name column의 값을 가지고 있으므로 중복된 행입니다.

index = 2, 3, 4, 5 --> 이 4개의 row는 서로 동일한 item_id, item_name column 값을 가지고 있으므로 중복된 행입니다.

 

또한 keep=False이므로 중복된 모든 row에 대해 중복 flag(True)를 달아준 것을 볼 수 있습니다.

 

 

 

 

 

 

 

 

 

import pandas as pd

dict_1 = {
    'item_id': [1, 1, 2, 2, 2, 2, 3, 4],
    'company': ['A', 'A', 'B', 'B', 'B', 'C', 'A', 'C'],
    'item_name': ['apple', 'apple', 'banana', 'banana', 'banana', 'banana', 'grape', 'watermelon'],
    'price': [15000, 15000, 4750, 4750, 4750, 4200, 13000, 18000],
    'color': ['red', 'red', 'yellow', 'yellow', 'yellow', 'yellow', 'purple', 'green']
}

df_1 = pd.DataFrame(dict_1)

df_duplicated_info = df_1.duplicated(subset=['item_id', 'item_name'], keep=False)

df_duplicated = df_1.loc[df_duplicated_info, :]
print(df_duplicated)




-- Result
   item_id company item_name  price   color
0        1       A     apple  15000     red
1        1       A     apple  15000     red
2        2       B    banana   4750  yellow
3        2       B    banana   4750  yellow
4        2       B    banana   4750  yellow
5        2       C    banana   4200  yellow

duplicated method의 결과가 boolean data를 가지는 Series라는 점을 이용하면

위 예시처럼 loc와 함께 사용하여 중복된 데이터만을 추출할 수 있습니다.

 

 

 

 

 

 

 

728x90
반응형
Comments