1. 중복된 행 조회 및 삭제

duplicated, drop_duplicates 함수를 이용해보자


  • duplicated()
name age blood
정국 24 A
28 B
태형 26 O
정국 24 A
남준 26 AB

이런 데이터가 주어진다고 하자.

duplicated() : 중복된 행이 나타나면 True 아니면 False를 나타내는 Boolean 마스크 생성

bts.duplicated()
0  False
1  False
2  False
3  True
4  False

name이 정국인 행과 똑같은 행이 3번째에 또 나와 True값이 나왔다.
그러나 만약 특정 열만 비교해 중복값을 뽑아내고 싶다면 옵션값에 subset을 이용하면 된다.

subset[‘age’]

bts.duplicated(subset=['age'])
0  False
1  False
2  False
3  True
4  True

subset을 사용해 특정 열 ‘age’만 보고 같은 행이 있는지 Boolean을 통해 알려준다.
여기서 나이만 보기 때문에 24인게 3행에 26인게 4행에 같아 True값이 나왔다.
subset에 여러 열의 값을 넣어 중복된 행을 찾아낼 수도 있다.

subset[‘age’,’blood’]

bts.duplicated(subset=['age','blood'])
0  False
1  False
2  False
3  True
4  False

위의 결과값에서 알 수 있듯이 나이와 혈액형을 기준으로 중복된 행은 3번째 행인 것을 알 수 있다.
나이가 24, 혈액형이 A이 0행과 3행이 값아 2번째로 같은 값이 나온 3행에서 True값이 나왔다.

  • drop_duplicates()

drop_duplicates() : 중복된 행들을 제거해주는 함수

bts.drop_duplicates() 

[Output]

name age blood
정국 24 A
28 B
태형 26 O
남준 26 AB

옵션을 주지 않고 기본 함수를 사용하면 모든 열의 값이 동일한 행을 삭제해준다.
그래서 이름이 전국인 행 전체가 사라진 것을 위와 같이 볼 수 있다.

drop_duplicates([‘age’], keep = ‘first’)

bts.drop_duplicates(['age'], keep = 'first') 

[Output]

name age blood
정국 24 A
28 B
태형 26 O

옵션 keep = ‘first’를 주면 중복된 값이 처음으로 나오는 행만 남겨두고 삭제하라는 의미이다.
그래서 나이는 26으로 태형, 남준이가 같았지만 처음으로 나온 태형의 행이 남은 것을 알 수 있다.
반대로 keep = ‘last’를 주면 마지막에 나온 행이 남을 것이다.

2. 데이터프레임에서 특정 열의 특정 값들을 대체

replace, apply 함수를 이용해보자

replace() : Series에 특정값을 다른 값으로

bts['name'] = bts['name'].replace({'진':'슈가'})
bts

[Output]

name age blood
정국 24 A
슈가 28 B
태형 26 O
정국 24 A
남준 26 AB

replace함수를 사용해 name에서 진을 슈가로 값을 대체하고 데이터프레임을 확인해보니 변경되었음을 알 수 있다.

또 다른 방법으로는 apply함수를 사용하는 것이다.
주로 저는 이 방법을 많이 사용하는데 그 이유는 단지 값을 일일이 replace처럼 바꾸는게 아니라 열을 원하는 방향으로 한 번에 변경해주기 때문이다.
예를 들면 age에 3씩 더해주거나 name뒤에 문자열을 추가할 수 있다.

bts[‘age’] = bts[‘age’].apply(lambda x : x + 3)

bts['age'] = bts['age'].apply(lambda x : x + 3) 
bts

[Output]

name age blood
정국 27 A
슈가 31 B
태형 29 O
정국 27 A
남준 29 AB

age가 3씩 증가함을 볼 수 있다.

bts[‘name’] = bts[‘name’].apply(lambda x : x + ‘귀여워’)

bts['name'] = bts['name'].apply(lambda x : x + ' 귀여워')
bts

[Output]

name age blood
정국 귀여워 27 A
슈가 귀여워 31 B
태형 귀여워 29 O
정국 귀여워 27 A
남준 귀여워 29 AB

숫자뿐만 아니라 문자열도 변경하는게 가능하다.
이 밖에도 함수를 다양하게 적용할 수 있고 데이터프레임 열을 같은 형식으로 한 번에 바꾼다는 장점이 있다.

이 밖에서 map, applymap 함수를 사용할 수 있다

map() : 1차원 원소별 적용하고 리스트로도 반환이 가능

bts[‘age’].map(lambda x : x+100)

bts['age'].map(lambda x : x+100)
bts

[Output]

name age blood
정국 귀여워 127 A
슈가 귀여워 131 B
태형 귀여워 129 O
정국 귀여워 127 A
남준 귀여워 129 AB

apply함수와 같이 age에 100을 더 한 값이 나옴을 볼 수 있다.
다만

  • apply와 map의 차이

apply는 데이터프레임 행별, 열별에 적용이 가능 But, map의 경우 1차원 원소별에만 적용이 가능

applymap() : 2차원 데이터프레임 구조의 원소별 적용

그래서 만약 BTS.applymap(lambda x : x + 100)을 사용하면 데이터프레임 전체에 숫자 100을 더할려고 할 것이다.
그러나 문자열엔 숫자연산이 적용되지 않아 ERROR가 뜬다.
그 점을 유의해면서 applymap함수는 사용해야 한다.