일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Python
- GIT
- Tkinter
- SQL
- Kotlin
- list
- array
- Excel
- Google Excel
- Mac
- math
- 파이썬
- PANDAS
- Google Spreadsheet
- numpy
- Java
- dataframe
- PostgreSQL
- matplotlib
- string
- Github
- django
- c#
- Redshift
- PySpark
- gas
- hive
- Apache
- google apps script
- Today
- Total
달나라 노트
Python Pandas : duplicated (중복값 확인하기) 본문
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와 함께 사용하여 중복된 데이터만을 추출할 수 있습니다.
'Python > Python Pandas' 카테고리의 다른 글
Python Pandas : shift (행 위치 옮기기) (0) | 2021.09.28 |
---|---|
Python Pandas : to_json (Series 또는 DataFrame을 json 형태로 변환하기) (0) | 2021.09.14 |
Python Pandas : iterrows (DataFrame의 행 반복하기) (0) | 2021.08.23 |
Python Pandas : head, tail (DataFrame에서 상위 행 또는 하위 행만 추출하기) (0) | 2021.08.03 |
Python Pandas : dataframe_image를 사용하여 DataFrame을 image로 저장하기 (save pandas dataframe as an image using dataframe_image) (2) | 2021.07.30 |