DataFrame에서 중복한 행(레코드)를 삭제하는 방법에 대해 알아보겠습니다.
중복한 행을 삭제하는 방법으로 drop_duplicates 함수를 사용합니다.
drop_duplicates 함수를 사용해 DataFrame에서 중복하는 행을 삭제하는 샘플을 보면서 사용 방법을 알아보겠습니다.
우선 샘플 데이터를 만들겠습니다.
import pandas as pd
df = pd.DataFrame({'name': ['AliceR', 'Bob', 'Charlie', 'Dave', 'Ellen', 'Frank'],
'age': [24, 42, 18, 68, 24, 30],
'state': ['NY', 'CA', 'CA', 'TX', 'CA', 'NY'],
'point': [64, 92, 70, 70, 88, 57]})
print(df)
# name age state point
# 0 AliceR 24 NY 64
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
df = df.append({'name': 'Dave',
'age': 68,
'state': 'TX',
'point': 70},
ignore_index=True)
print(df)
# name age state point
# 0 Alice 24 NY 64
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
# 6 Dave 68 TX 70
우선 샘플데이터로 DataFrame을 작성하고 마지막 행에 중복된 값을 추가했습니다.
인덱스 3번째와 6번째는 중복 데이터 입니다.
drop_duplicates 사용해 DataFrame에서 중복하는 데이터를 삭제 하겠습니다.
import pandas as pd
df = pd.DataFrame({'name': ['AliceR', 'Bob', 'Charlie', 'Dave', 'Ellen', 'Frank'],
'age': [24, 42, 18, 68, 24, 30],
'state': ['NY', 'CA', 'CA', 'TX', 'CA', 'NY'],
'point': [64, 92, 70, 70, 88, 57]})
# 마지막행 중복 데이터 추가
df = df.append({'name': 'Dave',
'age': 68,
'state': 'TX',
'point': 70},
ignore_index=True)
# 중복데이터 삭제후 출력
print(df.drop_duplicates())
# name age state point
# 0 AliceR 24 NY 64
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
중복되는 마지막행이 삭제되고 출력되었습니다.
drop_duplicates함수에 파라미터를 설정해 사용할 수 있습니다.
설정할 수 있는 파라미터 옵션으로 keep과 subset이 있습니다.
keep 옵션 사용 방법을 보겠습니다.
keep 옵션은 중복하는 값중 어떤행을 표시 할것인지 제어할 수 있습니다.
기본값을 ‘first’입니다.
keep 옵션을 생략하는 경우에는 기본값인 ‘first’가 적용되 중복된 행중 첫 번째 행이 출력이 됩니다.
keep 옵션에 ‘last’를 설정해보겠습니다.
import pandas as pd
df = pd.DataFrame({'name': ['AliceR', 'Bob', 'Charlie', 'Dave', 'Ellen', 'Frank'],
'age': [24, 42, 18, 68, 24, 30],
'state': ['NY', 'CA', 'CA', 'TX', 'CA', 'NY'],
'point': [64, 92, 70, 70, 88, 57]})
# 마지막행 중복 데이터 추가
df = df.append({'name': 'Dave',
'age': 68,
'state': 'TX',
'point': 70},
ignore_index=True)
# 중복데이터 삭제후 출력
print(df.drop_duplicates(keep='last'))
결과
name age state point
0 AliceR 24 NY 64
1 Bob 42 CA 92
2 Charlie 18 CA 70
4 Ellen 24 CA 88
5 Frank 30 NY 57
6 Dave 68 TX 70
keep 옵션에 ‘last’를 설정해 출력된 결과에는 중복된 값중 인덱스 3이 표시되지 않았습니다.
중복된 값중 마지막 행인 인덱스 6이 표시되었습니다.
keep 옵션에는 False를 설정 할 수도 있습니다.
False를 설정한 경우에는 중복되는 모든 값이 출력되지 않습니다.
import pandas as pd
df = pd.DataFrame({'name': ['AliceR', 'Bob', 'Charlie', 'Dave', 'Ellen', 'Frank'],
'age': [24, 42, 18, 68, 24, 30],
'state': ['NY', 'CA', 'CA', 'TX', 'CA', 'NY'],
'point': [64, 92, 70, 70, 88, 57]})
# 마지막행 중복 데이터 추가
df = df.append({'name': 'Dave',
'age': 68,
'state': 'TX',
'point': 70},
ignore_index=True)
# 중복데이터 모두 삭제후 출력
print(df.drop_duplicates(keep=False))
결과
name age state point
0 AliceR 24 NY 64
1 Bob 42 CA 92
2 Charlie 18 CA 70
4 Ellen 24 CA 88
5 Frank 30 NY 57
keep 옵션에 False를 설정하고 출력한 결과를 보면 중복하는 행이 모두 삭제되고 출력되었습니다.
이번에는 subset 옵션에 대해 알아보겠습니다.
파라미터에 subset 옵션을 지정할 수 있습니다.
subset 옵션은 중복하는 값이 존재하는 열을 지정할 수 있습니다.
subset에 지정한 열에 중복된 값이 있는 행을 삭제합니다.
import pandas as pd
df = pd.DataFrame({'name': ['AliceR', 'Bob', 'Charlie', 'Dave', 'Ellen', 'Frank'],
'age': [24, 42, 18, 68, 24, 30],
'state': ['NY', 'CA', 'CA', 'TX', 'CA', 'NY'],
'point': [64, 92, 70, 70, 88, 57]})
# 마지막행 중복 데이터 추가
df = df.append({'name': 'Dave',
'age': 68,
'state': 'TX',
'point': 70},
ignore_index=True)
# state 컬럼에 중복데이터 삭제후 출력
print(df.drop_duplicates(subset='state'))
결과
name age state point
0 AliceR 24 NY 64
1 Bob 42 CA 92
3 Dave 68 TX 70
출력된 결과를 보면 state 열에서 중복된 값이 있는 행은 삭제되고 출력되었습니다.
열을 여러개 지정할 수 있습니다.
import pandas as pd
df = pd.DataFrame({'name': ['AliceR', 'Bob', 'Charlie', 'Dave', 'Ellen', 'Frank'],
'age': [24, 42, 18, 68, 24, 30],
'state': ['NY', 'CA', 'CA', 'TX', 'CA', 'NY'],
'point': [64, 92, 70, 70, 88, 57]})
# 마지막행 중복 데이터 추가
df = df.append({'name': 'Dave',
'age': 68,
'state': 'TX',
'point': 70},
ignore_index=True)
# state와 point 컬럼에 중복데이터 삭제후 출력
print(df.drop_duplicates(subset=['state', 'point']))
결과
name age state point
0 AliceR 24 NY 64
1 Bob 42 CA 92
2 Charlie 18 CA 70
3 Dave 68 TX 70
4 Ellen 24 CA 88
5 Frank 30 NY 57
결과를 보면 subset에 지정한 state와 point 열 두 개의 값이 모두 일치하는 행을 삭제하고 표시하고 있습니다.
여러개 열을 지정한 경우에는 지정한 열의 모든 값이 일치하는 경우에만 삭제를 합니다.
댓글