파이썬 기반 데이터분석을 위하여 Pandas 데이터프레임 객체의 신규 변수를 생성하는 방법을 알아보자.
※ 본 내용에서 사용하는 diamonds.csv 파일은 별도로 다운로드 받아야 한다.
※ diamonds.csv 다운받기 [클릭]
개요
단순히 주어진 데이터를 필터링하고 기초통계량을 살펴보는 것으로 데이터분석이 끝나는 것은 아니다. Pandas 데이터프레임 객체를 다루면서 별도 연산을 위해 단일 값을 원소로 하는 변수를 추가하거나 기존 변수를 조합해서 새로운 변수를 만드는 등 여러 목적을 위해 새로운 변수를 생성한다. 그 중 기본적인 신규 변수 생성에 대해 알아본다.
다음의 데이터를 준비하자.
1 | import pandas as pd |
carat | cut | color | clarity | depth | table | price | x | y | z | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0.23 | Ideal | E | SI2 | 61.5 | 55.0 | 326 | 3.95 | 3.98 | 2.43 |
1 | 0.21 | Premium | E | SI1 | 59.8 | 61.0 | 326 | 3.89 | 3.84 | 2.31 |
실습
단일 값을 가지는 신규 변수를 생성해보자.
1 | df["new1"] = 100 |
carat | cut | color | clarity | depth | table | price | x | y | z | new1 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.23 | Ideal | E | SI2 | 61.5 | 55.0 | 326 | 3.95 | 3.98 | 2.43 | 100 |
1 | 0.21 | Premium | E | SI1 | 59.8 | 61.0 | 326 | 3.89 | 3.84 | 2.31 | 100 |
“new1”과 “new2” 변수가 생성되었을 것으로 판단되나 실상은 “new1” 변수만 생성된 것을 확인할 수 있다. 이전 데이터프레임 관련 게시글에서 특정 변수에 접근할 때 대괄호를 사용하지 않고 어트리뷰트에 접근하는 식으로 할 경우 올바르게 동작하지 않는 것을 다뤘는데 이것처럼 신규 변수를 생성할 때에도 객체의 어트리뷰트에 접근하는 것 처럼 코드를 작성한 경우 원하는 결과가 나오지 않을 수 있다는 것을 알 수 있다. 사실 “new2”에 대한 정보는 다음과 같이 확인할 수 있다.
1 | df.new2 |
“df” 객체의 “new2” 어트리뷰트에 200이라는 값이 할당된 것을 볼 수 있다. 이렇게 신규 변수를 생성할 때도 어트리뷰트에 접근하는 식의 코드 작성방식은 문제가 될 수 있기 때문에 지양해야 하겠다.
아무튼 새로운 변수를 생성하고자 하는 경우 기존 데이터프레임 객체에 해당 변수명이 없어야(겹치지 않아야) 데이터프레임의 가장 오른쪽에 새로운 변수가 자리잡는 것을 볼 수 있다.
이번에는 기존 변수에 산술연산을 실시한 값으로 새로운 변수를 만들어보자.
1 | df["x100"] = df["x"] + 100 |
carat | cut | color | clarity | depth | table | price | x | y | z | new1 | x100 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.23 | Ideal | E | SI2 | 61.5 | 55.0 | 326 | 3.95 | 3.98 | 2.43 | 100 | 103.95 |
1 | 0.21 | Premium | E | SI1 | 59.8 | 61.0 | 326 | 3.89 | 3.84 | 2.31 | 100 | 103.89 |
다음으로는 두 수치형 변수를 조합하여 새로운 변수를 만들어보자.
1 | df2 = df.loc[:, :"depth"].copy() |
carat | cut | color | clarity | depth | multi | str_cat | |
---|---|---|---|---|---|---|---|
0 | 0.23 | Ideal | E | SI2 | 61.5 | 14.145 | Ideal_E |
1 | 0.21 | Premium | E | SI1 | 59.8 | 12.558 | Premium_E |
두 수치형 변수를 조합하여 새로 만든 “multi” 변수와 두 문자형 변수를 조합하여 새로 만든 “str_cat” 변수가 있다. 원소기반의 연산이 이루어지며 문자형 변수의 경우 +
연산자로 각 변수의 문자열을 이어붙일 수 있다.
이번엔 특정 조건을 기반으로 하는 신규 변수 생성에 대해 알아보자. 여기서는 NumPy 라이브러리를 활용하는 방법도 있고 다양한 방법으로 생성할 수 있다.
다음의 코드를 입력하고 그 결과를 확인해보자.
1 | import numpy as np |
carat | cut | color | clarity | depth | multi | str_cat | color1 | color2 | color3 | color4 | color5 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.23 | Ideal | E | SI2 | 61.5 | 14.145 | Ideal_E | 1 | 1 | 1 | 1 | 0 |
1 | 0.21 | Premium | E | SI1 | 59.8 | 12.558 | Premium_E | 1 | 1 | 1 | 1 | 0 |
“color1”, “color2”, “color3” 변수의 경우 “color” 변수의 원소가 “E”인 경우 1이 되고 나머지 원소는 0으로 된다. 해당 내용은 다음의 코드로 그 결과를 확인해볼 수 있다.
1 | pd.crosstab(df2["color"], df2["color1"]) |
color1 | 0 | 1 |
---|---|---|
color | ||
D | 6775 | 0 |
E | 0 | 9797 |
F | 9542 | 0 |
G | 11292 | 0 |
H | 8304 | 0 |
I | 5422 | 0 |
J | 2808 | 0 |
“color4” 변수는 원소 “E”만 1이 되고 나머지는 기존 원소 그대로 있다. 물론 이 것은 .replace()
메서드를 사용해서도 똑같이 만들 수 있다. 그리고 확인은 다음의 코드로 할 수 있다.
1 | pd.crosstab(df2["color"], df2["color4"]) |
color4 | 1 | D | F | G | H | I | J |
---|---|---|---|---|---|---|---|
color | |||||||
D | 0 | 6775 | 0 | 0 | 0 | 0 | 0 |
E | 9797 | 0 | 0 | 0 | 0 | 0 | 0 |
F | 0 | 0 | 9542 | 0 | 0 | 0 | 0 |
G | 0 | 0 | 0 | 11292 | 0 | 0 | 0 |
H | 0 | 0 | 0 | 0 | 8304 | 0 | 0 |
I | 0 | 0 | 0 | 0 | 0 | 5422 | 0 |
J | 0 | 0 | 0 | 0 | 0 | 0 | 2808 |
마지막으로 “color5” 변수는 “J”와 “H” 원소가 1로 변환되고 나머지 원소는 0으로 변환된 것이다. 다음의 코드로 확인해보자.
1 | pd.crosstab(df2["color"], df2["color5"]) |
color5 | 0 | 1 |
---|---|---|
color | ||
D | 6775 | 0 |
E | 9797 | 0 |
F | 9542 | 0 |
G | 11292 | 0 |
H | 0 | 8304 |
I | 5422 | 0 |
J | 0 | 2808 |
상기 내용 이외에도 여러 방법이 있지만 이후의 게시글을 통해 다루고자 한다.