일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- django
- Java
- list
- Tkinter
- hive
- GIT
- Apache
- dataframe
- matplotlib
- Mac
- math
- string
- numpy
- array
- google apps script
- Excel
- Kotlin
- Redshift
- gas
- Google Spreadsheet
- Github
- Python
- PySpark
- PostgreSQL
- SQL
- 파이썬
- PANDAS
- Google Excel
- c#
- Today
- Total
달나라 노트
Python Pandas : drop_duplicates (중복제거, DataFrame 중복값 삭제, DataFrame에서 중복 행 삭제) 본문
Python Pandas : drop_duplicates (중복제거, DataFrame 중복값 삭제, DataFrame에서 중복 행 삭제)
CosmosProject 2020. 11. 9. 13:53
DataFrame.drop_duplicates
DataFrame의 drop_duplicates는 중복된 값을 가진 행을 제거하고 unique한 행만 남도록 해주는 기능을 제공합니다.
Syntax
DataFrame.drop_duplicates(subset=[column_names],
keep='first'/'last',
inplace=True/False,
ignore_index=True/False)
drop_duplicates에 들어갈 수 인자 중 자주 쓰이는 것들은 같습니다.
1. subset에 명시한 컬럼들 기준으로 중복제거가 진행됩니다.
2. keep='first' -> 중복된 컬럼 중 가장 위쪽의 행을 남기고 그 아래의 행들은 삭제
keep='last' -> 중복된 컬럼 중 가장 아래쪽의 행을 남기고 그 아래의 행들은 삭제
default값은 'first'입니다.
3. inplace=True -> 원본 DataFrame에 대해 중복 행 제거
inplace=False -> 원본 DataFrame은 그대로 놔두고 중복된 행을 제거하여 반환
default값은 False입니다.
4. ignore_index=True -> 중복제거한 후의 DataFrame에 대해 0부터 새로 index를 할당
ignore_index=False -> 중복제거한 후의 DataFrame에 대해 원본 DataFrame의 index 사용
default값은 False입니다.
먼저 test용 DataFrame을 생성합니다.
import pandas as pd
dict_1 = {
'col1': [1, 1, 1, 2, 3, 3, 3, 3, 4, 4, 5],
'col2': [1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5],
'col3': [1, 2, 3, 2, 2, 3, 3, 3, 3, 4, 4]
}
df_1 = pd.DataFrame(dict_1)
print(df_1)
print(type(df_1))
- Output
col1 col2 col3
0 1 1 1
1 1 1 2
2 1 1 3
3 2 2 2
4 3 3 2
5 3 3 3
6 3 3 3
7 3 4 3
8 4 4 3
9 4 4 4
10 5 5 4
<class 'pandas.core.frame.DataFrame'>
아래 예시는 col1과 col2를 기준으로 중복제거를 합니다.
따라서 col3이 어떤 값을 가지고 있는지에 상관없이 col1과 col2의 데이터가 동일한 행을 제거합니다.
index = 0, 1, 2인 행의 col1, col2데이터가 모두 1, 1이었습니다.
따라서 비록 index = 0, 1, 2인 행의 col3값이 1, 2, 3으로 달라도 col3는 중복제거 기준 컬럼이 아니므로 고려되지 않습니다.
또한 더 위쪽에 존재하는 행인 index행만 남고 그 아래의 index = 1, 2인 행은 사라지게됩니다.
다른 행들도 마찬가지로 중복제거 되었습니다.
df_test = df_1.drop_duplicates(subset=['col1', 'col2'])
print(df_test)
print(type(df_test))
- Output
col1 col2 col3
0 1 1 1
3 2 2 2
4 3 3 2
7 3 4 3
8 4 4 3
10 5 5 4
<class 'pandas.core.frame.DataFrame'>
위와 동일하지만 keep인자를 변경시켜보았습니다.
keep인자는 기본값이 first라고 하였으므로 keep='first'는 위에서 다뤘던 예시와 동일한 결과값을 내놓습니다.
그러나 keep='last'로 설정한 경우 col1, col2가 모두 중복된 값을 가지는 index = 0, 1, 2 행에 대해서 가장 마지막에 존재하는 index=2행이 남고 그 위의 행들은 사라졌습니다.
df_test_1 = df_1.drop_duplicates(subset=['col1', 'col2'], keep='first')
df_test_2 = df_1.drop_duplicates(subset=['col1', 'col2'], keep='last')
print(df_test_1)
print(type(df_test_1))
print(df_test_2)
print(type(df_test_2))
- Output
col1 col2 col3
0 1 1 1
3 2 2 2
4 3 3 2
7 3 4 3
8 4 4 3
10 5 5 4
<class 'pandas.core.frame.DataFrame'>
col1 col2 col3
2 1 1 3
3 2 2 2
6 3 3 3
7 3 4 3
9 4 4 4
10 5 5 4
<class 'pandas.core.frame.DataFrame'>
inplace=False일 경우 결과는 동일하지만 원본 DataFrame인 df_1의 데이터는 보존되며 중복제거가 된 DataFrame이 반환되어 df_test라는 변수에 저장됩니다.
df_test = df_1.drop_duplicates(subset=['col1', 'col2'], keep='first', inplace=False)
print(df_test)
print(type(df_test))
print(df_1)
print(type(df_1))
- Output
col1 col2 col3
0 1 1 1
3 2 2 2
4 3 3 2
7 3 4 3
8 4 4 3
10 5 5 4
<class 'pandas.core.frame.DataFrame'>
col1 col2 col3
0 1 1 1
1 1 1 2
2 1 1 3
3 2 2 2
4 3 3 2
5 3 3 3
6 3 3 3
7 3 4 3
8 4 4 3
9 4 4 4
10 5 5 4
<class 'pandas.core.frame.DataFrame'>
inplace=True인 경우 결과는 동일하지만 원본 DataFrame 자체에 중복제거를 합니다.
df_1.drop_duplicates(subset=['col1', 'col2'], keep='first', inplace=True)
print(df_1)
print(type(df_1))
- Output
col1 col2 col3
0 1 1 1
3 2 2 2
4 3 3 2
7 3 4 3
8 4 4 3
10 5 5 4
<class 'pandas.core.frame.DataFrame'>
지금까지의 예시에서는 결과 DataFrame의 index가 원본 DataFrame의 index를 그대로 가져왔습니다.
그래서 결과 DataFrame들을 보면 index가 0, 3, 4, 7 등으로 띄엄띄엄 매겨져있습니다.
행들이 중복제거되어 사라지면서 사라진 행들의 index도 사라진겁니다.
그 이유는 ignore_index의 기본값이 False였기 때문이죠.
그러나 ignore_index=True로 설정하면 중복제거된 결과 DataFrame의 index를 0부터 새로 매기게됩니다.
아래 예시를 보면 index가 0부터 5까지 차례대로 매겨져 있음을 알 수 있죠.
df_1.drop_duplicates(subset=['col1', 'col2'], keep='first', inplace=True, ignore_index=True)
print(df_1)
print(type(df_1))
- Output
col1 col2 col3
0 1 1 1
1 2 2 2
2 3 3 2
3 3 4 3
4 4 4 3
5 5 5 4
<class 'pandas.core.frame.DataFrame'>