상세 컨텐츠

본문 제목

[Python](Pandas) 데이터 가공-1 : DataFrame에 새로운 Column 추가하기

본문

DataFrame에 새로운 Column 추가하기.

 

사실 이는 앞의 글에서 예제에 사용한 데이터 프레임 st_df를 만들 때 자연스럽게 했던 과정이다.

이번에는 이를 다시 한 번 연습해본다는 느낌으로 접근해보자.

 

1. 딕셔너리와 DataFrame

 

먼저, 이해를 돕기 위하여 DataFrame과 딕셔너리를 비교하여 살펴보자.

DataFrame의 구성요소는 다음과 같이 딕셔너리에 대응시킬 수 있다.

 

- DataFrame의 Column ↔ 딕셔너리의 key

- DataFrame의 value ↔ 딕셔너리의 value

 

이러한 점을 잘 기억하며 딕셔너리를 다시 떠올려보자.

 

딕셔너리에서 새로운 key값을 추가할 때는 어떻게 해야 하는가?

예를 들어서 dict_a라는 빈 딕셔너리에 'greeting'이라는 key를 새로 추가하고, 그에 해당하는 value로 'Hello'를 넣는다고 해보자.

이런 경우에는 다음과 같이 dict_a의 새로운 key값을 정의해주면 된다.

dict_a={}
dict_a['greeting'] = 'Hello'
dict_a

{'greeting': 'Hello'}

 

빈 딕셔너리에 'greeting'이라는 key가 생기고, 그에 대응되는 value 역시 함께 생성된 것을 확인할 수 있다.

같은 방법으로 새로운 key와 value를 하나 서 추가해보자.

dict_a['동물'] = ['코끼리', '토끼', '사슴', '찍찍이']
dict_a

{'greeting': 'Hello', '동물': ['코끼리', '토끼', '사슴', '찍찍이']}

 

마찬가지로 기존의 딕셔너리에 새로운 key와 value가 추가된 것을 확인할 수 있다.

 

여기서 포인트는, 딕셔너리의 새로운 key에 새 value를 정의하는 것으로 새로운 key를 생성한다는 점이다.

이 점을 잘 기억하며 DataFrame의 Column을 추가해보자.

 

 

2. DataFrame의 Column 추가하기

 

I. DataFrame 불러오기

자, 그럼 이제 DataFrame으로 돌아와보자.

가장 먼저 해야 할 일은 pandas 라이브러리를 불러오는 것.

import pandas as pd

 

이제 연습에 사용할 DataFrame을 가져올 것인데, 아래 링크의 글에서 만든 zoo_df를 이용할 것이다.

 

링크 : https://kongalmengi.tistory.com/18

 

[Python](Pandas) DataFrame 합치기(concat, join, merge)

이번에는 두 DataFrame을 하나로 합치는 방법을 알아볼 것이다. 항상 그렇듯, pandas 라이브러리를 불러오고 시작하자. import pandas as pd DataFrame을 합치는데 사용할 메소드는 아래와 같다. - .concat() - .jo

kongalmengi.tistory.com

 

zoo_df를 불러오자

zoo_df

 

이제 몇 가지 상황을 설정하고, 본격적으로 zoo_df에 새로운 Column을 추가해보자.

 

 

II. Column 추가하기-1

이 동물원에서 공사업체를 선정하여, 동물들의 축사를 일괄 리뉴얼 했다.

그런데 전달사항에 착오가 생겨, 공사업체에서 축사의 높이를 모두 250cm으로 만들어놨다. 그때문에 그보다 큰 동물들은 축사를 사용할 수 없게 되었다.

 

동물원에서는 이를 해결하고자 재공사를 하기로 했다.

다만 모든 축사를 재공사 할 필요는 없고, 축사의 높이가 키보다 작은 친구들에 대해서만 재공사를 할 예정이다.

이와 관련하여 재공사 필요 여부를 판단하는 데이터를 추가하고자 한다.

그럼 데이터를 추가해보자.

 

방법은 어렵지 않다.

앞의 딕셔너리의 예를 통해 보여줬던 것처럼, 여기서도 같은 방법으로 새로운 Column과 그에 해당하는 value를 정의하면 끝이다.

 

※ ※ ※

- 새 Column명 : 비고

- 새 Column에 해당되는 value :

  a. (동물의 키 >= 축사의 높이)인 경우, '재공사 요망' 출력

  b. (동물의 키 < 축사의 높이)인 경우, '-' 출력

※ ※ ※

 

이를 코드로 구성해보면 아래와 같다.

zoo_df['비고'] = '-'  # '비고' Column의 기본값으로 '-'로 설정

# 키가 250 이상인 행에 대하여 '비고'Column을 '재공사 요망'으로 수정
zoo_df.loc[zoo_df['키(cm)'] >= 250, '비고'] = '재공사 요망'
zoo_df

 

위의 코드를 이용하여 '비고' Column을 만들고, 키가 250 이상인 친구들에 대하여 '재공사 요망'을 출력하는 표를 새로 만들어냈다.

 

(※ 코드에 대해 설명하자면 먼저 .loc[]에 대해 알아야 한다. 일단 여기서는 DataFrame에서 원하는 행과 열을 추출하는 도구 정도로 받아들이면 된다. .loc[]에 대해 조금 더 자세한 정보가 필요하다면, 이에 대한 글이 따로 있으니 아래 링크를 참조하도록 하자.)

 

링크 : https://kongalmengi.tistory.com/20

 

[Python](Pandas) 데이터 가공 연습-2 : DataFrame의 행과 열 추출하기, 그리고 .loc[]

이번 글에서는 DataFrame의 행(Row)과 열(Column)을 추출하는 방법에 대해 알아볼 것이다. 이하 예제에는 이전 글에서 만든 DataFrame인, zoo_df를 이용하도록 한다. 링크 : https://kongalmengi.tistory.com/19 [Python](

kongalmengi.tistory.com

 

 

 

다시 본론으로 돌아와서, '비고'라는 새 Column을 추가하는 코드를 살펴보자.

해당 코드의 흐름은, 앞서 설명한 딕셔너리에서 새 key를 생성하는 과정과 동일하다.

새 Column에 대한 값을 정의해주는 것.

여기에 특정 조건을 만족하는 행에 대한 값을 수정하는 과정만 추가되었을 뿐이다.

 

이해를 돕고자 딕셔너리와 비교하며 진행과정을 소개하였다.

하지만 오히려 이해에 방해가 된다면 딕셔너리에 대한 이야기는 잊어버리고, 그저 위의 코드를 보며 아래와 같은 사항만 확인해도 된다.

 

- 새로운 Column('비고')과 그 Column의 기본값('-')을 정의한다.

- 그 다음, 특정 조건(키 >= 250)을 만족하는 행에 대하여 '비고' Column을 뽑아, 값을 '재공사 요망'으로 바꿔준다.

 

III. Column 추가하기-2

앞선 과정과 같이 새 Column을 추가하는 방법은 또 있다.

Numpy 라이브러리의 .where() 함수를 이용하는 방법이다.(메소드가 아니다.)

물론 기본적인 코드 구성의 흐름은 위의 II. Column 추가하기-1과 크게 다르지 않다.

 

먼저 .where()함수를 이용하기 위해서는 Numpy 라이브러리를 불러와야 한다.

import numpy as np

 

이제 '비고' Column을 만들고, 재공사가 필요한 축사(키보다 작은 축사)를 받은 친구들에 대해 '재공사 요망'을 할당해주자.

zoo_df['비고'] = np.where(zoo_df['키(cm)'] > 250, '재공사 요망', '-')
zoo_df

 

마찬가지로 '비고' Column이 추가된 DataFrame을 얻었다.

일단 이렇게 원하는 DataFrame을 만들긴 했는데, 대체 .where()는 무슨 역할을 하며, 어떻게 써먹는 것인가?

.where()는 Numpy 라이브러리의 함수 중 하나이며, 기본적으로 아래와 같이 써먹는다.

np.where(조건, 값1, 값2)

 

여기서 '조건'은 말 그대로 조건식이며, 해당 조건식에 대해 True가 성립하면 값1을, False가 성립하면 값2를 반환한다.

그리하여 앞에서 사용한 코드를 다시 살펴보면, 코드가 반환하는 값을 아래와 같이 정리할 수 있다.

 

- zoo_df['키(cm)'] > 250인 경우 : '재공사 요망' 출력

- zoo_df['키(cm)'] > 250가 아닌 경우 : '-' 출력

 

이렇게 출력되는 값을 zoo_df['비고']에 반환하는데, 여기서 zoo_df에는 '비고' Column이 없으므로 해당 Column을 새로 만들고, 거기에 값을 반환한 것이다.

이렇게 존재하지 않는 Column을 새로 정의하면 해당 Column이 생성된다는 원리는 앞선 딕셔너리에서 key값을 정의하는 것으로 새로운 key값을 만들어내는 것과 유사하니, 비교하여 알아두면 좋을 것 같다.

 

 

IV. Column 추가하기-3

새로운 Column을 추가하는 방법은 위에서 소개한 2가지 방법 외에도 또 하나 있다.

.assign() 메소드를 이용하는 것이다.

코드를 구성해보면 아래와 같다.

import numpy as np

new_zoo_df = zoo_df.assign(재공사_필요여부=np.where(zoo_df['키(cm)'] > 250, '재공사 요망', '-'))
new_zoo_df

 

 

V. Column 추가하기-4

앞에서 살펴본 것들을 복습할 겸, 새로운 Column을 또 추가해보자.

이번에는 '들이받은 수'와 관련된 새로운 Column을 추가할 것이다.

 

앞에서 zoo_df를 만들 때, 다음과 같은 설정이 있었다.

해당 동물원의 동물들은 배가 고프면 사육사를 들이 받는 습성이 있다고...

zoo_df의 '들이받은 수' Column이 의미하는 바가 바로 그것이다.

정확히는 1주일에 사육사를 몇 번 들이 받았는지를 기록한 값이다.

 

여기서 해당 동물원은 사육사를 많이 들이받는 친구들에게 밥을 더 줘야 한다는 결론을 내렸다.

이에 아래와 같은 기준을 세웠다.

 

- 조건 : 1주일에 사육사를 7회 이상 들이받은 친구들에게는 밥을 더 준다.

 

이제 위의 조건에 따라 밥을 더 줘야 할 친구들을 보여주는 Column을 아래와 같이 추가할 것이다.

# 새로 추가시킬 Column의 기본값 설정
zoo_df['밥 추가'] = '-'

# '들이받은 수'가 7회 이상인 경우에는 '밥 추가 필요' 출력
zoo_df.loc[zoo_df['들이받은 수'] >= 7, '밥 추가'] = '밥 추가 필요'
zoo_df

 

이렇게 '밥 추가' Column을 새로 추가했다.

그런데 조금 사소한 부분이지만 눈에 걸리는 부분이 있다.

일반적인 표에서 '비고' 항목은 가장 마지막에 온다. 하지만 위의 표는 그렇지 않다.

그럼 Column의 위치를 재배치하여, '비고' Column을 가장 마지막으로 밀어보자.

 

Column의 위치를 재설정하는 방법은 아래와 같이 .reindex() 메소드를 사용한다.

zoo_df = zoo_df.reindex(columns = ['종류', '이름', '키(cm)', '들이받은 수', '밥 추가', '비고']) # 새로 정의해줘야 적용된 결과를 확인할 수 있다.
zoo_df

 

Column의 위치가 재설정 되었다.

여기서 .reindex()를 이용할 때 주의사항은, 코드 내의 주석에서 말 해주듯이 DataFrame을 새로 정의해줘야 결과를 확인할 수 있다는 점이다.

그냥 zoo_df.reindex(columns = ['종류', '이름', '키(cm)', '들이받은 수', '밥 추가', '비고'])만 쓰고 zoo_df를 출력하면 변경사항이 적용되지 않은 결과물만 확인할 수 있을 뿐이다.

관련글 더보기