달나라 노트

Python Pandas : drop_duplicates (중복제거, DataFrame 중복값 삭제, DataFrame에서 중복 행 삭제) 본문

Python/Python Pandas

Python Pandas : drop_duplicates (중복제거, DataFrame 중복값 삭제, DataFrame에서 중복 행 삭제)

CosmosProject 2020. 11. 9. 13:53
728x90
반응형

 

 

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'>

 

 

 

 

 

 

728x90
반응형
Comments