본문 바로가기

카테고리 없음

[파이썬] Pandas 컬럼 추가, 수정, 삭제하기: str.split(), str.replace()

데이터를 처리하다 보면 때때로 컬럼을 추가, 수정, 삭제해야 하는 경우가 있습니다. 예를 들어 기존의 데이터를 조합하여 새로운 컬럼을 만들고 싶을 수 있습니다. 또는 특정 값을 바꾸고 싶을 수도 있습니다. 이번 시간에는 컬럼을 추가, 수정하는 방법을 알아보겠습니다.

 

샘플 데이터 불러오기

In [1]:
# 판다스 라이브러리 임포트
import pandas as pd
# plotly express에 내장되어있는 gapminder 데이터프레임을 사용하겠습니다.
import plotly.express as px
# plotly가 설치되어있지 않다면 아래 명령으로 설치할 수 있습니다.
# !pip install plotly
 
In [2]:
df = px.data.gapminder()

 

데이터 살펴보기

In [3]:
df.head()
 
Out[3]:
 
  country continent year lifeExp pop gdpPercap iso_alpha iso_num
0 Afghanistan Asia 1952 28.801 8425333 779.445314 AFG 4
1 Afghanistan Asia 1957 30.332 9240934 820.853030 AFG 4
2 Afghanistan Asia 1962 31.997 10267083 853.100710 AFG 4
3 Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
4 Afghanistan Asia 1972 36.088 13079460 739.981106 AFG 4
 

컬럼 추가하기

만약 새로 추가하는 컬럼의 값이 모두 동일하다면 아래와 같이 간단히 해결할 수 있습니다.

 

In [4]:
# 컬럼에 집어넣는 모든 값이 동일하다면 
# 변수 할당과 마찬가지로 =를 사용하면 됩니다.
df['source'] = 'gapminder/Sweden'

df.head()
 
Out[4]:
 
  country continent year lifeExp pop gdpPercap source
0 Afghanistan Asia 1952 28.801 8425333 779.445314 gapminder/Sweden
1 Afghanistan Asia 1957 30.332 9240934 820.853030 gapminder/Sweden
2 Afghanistan Asia 1962 31.997 10267083 853.100710 gapminder/Sweden
3 Afghanistan Asia 1967 34.020 11537966 836.197138 gapminder/Sweden
4 Afghanistan Asia 1972 36.088 13079460 739.981106 gapminder/Sweden
 

하지만 이런 경우는 흔치 않습니다. 대부분의 경우 기존 컬럼을 이용하여 새로운 컬럼을 만들게 됩니다.

 
In [5]:
# gdpPercap 컬럼과 pop 컬럼을 곱하여 산출한 값을 
# 새로운 컬럼 real_gdp에 할당합니다.
df['real_gdp'] = df['gdpPercap'] * df['pop']

# 결과를 출력합니다
df.head()
 
Out[5]:
 
  country continent year lifeExp pop gdpPercap source real_gdp
0 Afghanistan Asia 1952 28.801 8425333 779.445314 gapminder/Sweden 6.567086e+09
1 Afghanistan Asia 1957 30.332 9240934 820.853030 gapminder/Sweden 7.585449e+09
2 Afghanistan Asia 1962 31.997 10267083 853.100710 gapminder/Sweden 8.758856e+09
3 Afghanistan Asia 1967 34.020 11537966 836.197138 gapminder/Sweden 9.648014e+09
4 Afghanistan Asia 1972 36.088 13079460 739.981106 gapminder/Sweden 9.678553e+09
 

컬럼 수정하기

어떤 컬럼은 여러 가지 의미를 가지고 있기도 합니다. 예를 들어 source 컬럼의 데이터는 '기관의 이름'과 '기관이 위치한 나라의 이름'을 합쳐 만든 데이터입니다. 이렇게 여러 가지 의미를 담고 있는 데이터는 그 의미 단위로 분리할 수 있습니다.

이때 데이터를 분리하는 좋은 방법은 .str.split() 함수를 사용하는 것입니다. 자세한 내용은 아래 예제를 보면서 알아보겠습니다.

 

In [6]:
# .str.split() 함수를 사용해서 /를 기준으로 데이터를 분리합니다.
# 별도의 기준를 집어넣지 않는다면 기본적으로 공백을 기준으로 분리합니다. 
# 그 결과를 새로운 변수 var_split에 할당합니다.
var_split = df['source'].str.split("/")

# 결과를 출력합니다.
# 변수 var_split은 시리즈입니다.
print(type(var_split))
print()

# 각각의 데이터는 리스트입니다.
print(type(var_split[0]))
print()

# 상위 5행을 출력합니다.
var_split.head()
<class 'pandas.core.series.Series'>

<class 'list'>

Out[6]:
0    [gapminder, Sweden]
1    [gapminder, Sweden]
2    [gapminder, Sweden]
3    [gapminder, Sweden]
4    [gapminder, Sweden]
Name: source, dtype: object
 

앞의 과정을 통해 문자열이 분리된 것을 확인했습니다. 이제 분리된 문자열을 데이터프레임의 새로운 컬럼으로 추가하겠습니다.

 

In [7]:
# .str 접근자(accessor)를 사용하면 
# 리스트의 인덱싱과 같은 방식으로 데이터를 추출할 수 있습니다.
# [gapminder, Sweden] 리스트에서 첫번째 요소를 가져옵니다.
value_name = var_split.str[0]

# 결과를 출력합니다
print(value_name.head())
print()

# .str 접근자(accessor)를 사용하면 
# 리스트의 인덱싱과 같은 방식으로 데이터를 추출할 수 있습니다.
# [gapminder, Sweden] 리스트에서 두번째 요소를 가져옵니다.
value_country = var_split.str[1]

# 결과를 출력합니다
print(value_country.head())
0    gapminder
1    gapminder
2    gapminder
3    gapminder
4    gapminder
Name: source, dtype: object

0    Sweden
1    Sweden
2    Sweden
3    Sweden
4    Sweden
Name: source, dtype: object
 
 
In [8]:
# 인덱싱 결과를 새로운 변수 foundation_name에 할당합니다.
df['foundation_name'] = value_name

# 인덱싱 결과를 새로운 변수 foundation_name에 할당합니다.
df['foundation_location'] = value_country

# 결과를 출력합니다.
df.head()
Out[8]:
 
  country continent year lifeExp pop gdpPercap source real_gdp foundation_name foundation_location
0 Afghanistan Asia 1952 28.801 8425333 779.445314 gapminder/Sweden 6.567086e+09 gapminder Sweden
1 Afghanistan Asia 1957 30.332 9240934 820.853030 gapminder/Sweden 7.585449e+09 gapminder Sweden
2 Afghanistan Asia 1962 31.997 10267083 853.100710 gapminder/Sweden 8.758856e+09 gapminder Sweden
3 Afghanistan Asia 1967 34.020 11537966 836.197138 gapminder/Sweden 9.648014e+09 gapminder Sweden
4 Afghanistan Asia 1972 36.088 13079460 739.981106 gapminder/Sweden 9.678553e+09 gapminder Sweden
 

이외에 컬럼의 값을 수정하는데 자주 쓰이는 함수로는 .str.replace()이 있습니다. .str.replace() 함수는 엑셀의 "찾기 및 바꾸기" 기능과 유사한 역할하며, .str.replace('찾을 내용`, `바꿀 내용`)과 같은 형태로 사용됩니다.

자세한 내용은 아래 예제를 보면서 알아보겠습니다.

 
In [9]:
# .str.replace()를 사용해 / 기호를 - 기호로 바꿨습니다.
# 결과의 상위 5행만 출력합니다.
df['source'].str.replace('/', '-').head()
Out[9]:
0    gapminder-Sweden
1    gapminder-Sweden
2    gapminder-Sweden
3    gapminder-Sweden
4    gapminder-Sweden
Name: source, dtype: object

 

컬럼 삭제하기

.drop() 메소드를 사용하여 삭제할 수 있습니다. 개인적으로는 컬럼을 삭제하기보다는 필요한 컬럼만 선택해서 새로운 데이터프레임을 만드는 것이 더 낫다고 생각합니다. 

 

 

-이 글은 아나콘다(Anaconda3)가 설치된 환경을 기준으로 작성되었습니다.