Py) 기초 - Pandas(신규 변수 생성)

Py) 기초 - Pandas(신규 변수 생성)

파이썬 기반 데이터분석을 위하여 Pandas 데이터프레임 객체의 신규 변수를 생성하는 방법을 알아보자.


※ 본 내용에서 사용하는 diamonds.csv 파일은 별도로 다운로드 받아야 한다.
diamonds.csv 다운받기 [클릭]

개요

단순히 주어진 데이터를 필터링하고 기초통계량을 살펴보는 것으로 데이터분석이 끝나는 것은 아니다. Pandas 데이터프레임 객체를 다루면서 별도 연산을 위해 단일 값을 원소로 하는 변수를 추가하거나 기존 변수를 조합해서 새로운 변수를 만드는 등 여러 목적을 위해 새로운 변수를 생성한다. 그 중 기본적인 신규 변수 생성에 대해 알아본다.

다음의 데이터를 준비하자.

1
2
3
import pandas as pd
df = pd.read_csv("../diamonds.csv")
df.head(2)
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
2
3
df["new1"] = 100
df.new2 = 200
df.head(2)
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
2
df.new2
## 200

“df” 객체의 “new2” 어트리뷰트에 200이라는 값이 할당된 것을 볼 수 있다. 이렇게 신규 변수를 생성할 때도 어트리뷰트에 접근하는 식의 코드 작성방식은 문제가 될 수 있기 때문에 지양해야 하겠다.

아무튼 새로운 변수를 생성하고자 하는 경우 기존 데이터프레임 객체에 해당 변수명이 없어야(겹치지 않아야) 데이터프레임의 가장 오른쪽에 새로운 변수가 자리잡는 것을 볼 수 있다.

이번에는 기존 변수에 산술연산을 실시한 값으로 새로운 변수를 만들어보자.

1
2
df["x100"] = df["x"] + 100
df.head(2)
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
2
3
4
df2 = df.loc[:, :"depth"].copy()
df2["multi"] = df2["carat"] * df2["depth"]
df2["str_cat"] = df2["cut"] + "_" + df2["color"]
df2.head(2)
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
2
3
4
5
6
7
import numpy as np
df2["color1"] = np.where(df2["color"] == "E", 1, 0)
df2["color2"] = (df2["color"] == "E").astype("int")
df2["color3"] = (df2["color"] == "E") + 0
df2["color4"] = np.where(df2["color"] == "E", 1, df2["color"])
df2["color5"] = df2["color"].isin(["J", "H"]) + 0
df2.head(2)
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

상기 내용 이외에도 여러 방법이 있지만 이후의 게시글을 통해 다루고자 한다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×