Py) 기초 - Pandas(수치연산)

Py) 기초 - Pandas(수치연산)

파이썬 기반 데이터분석을 위하여 Pandas 라이브러리 객체의 수치형 자료의 연산에 대해 알아본다.


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

개요

Pandas 라이브러리가 NumPy 라이브러리 기반으로 제작되었기 때문에 역시나 많은 수치연산 함수 또는 메서드를 지원한다. 관련 내용을 알아보기 전에 다음과 같이 “diamonds.csv” 파일을 준비한다.

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

그리고 “ser” 시리즈 객체도 준비한다.

1
2
3
4
5
6
7
ser = pd.Series([1, 3, 5, 7])
ser
## 0 1
## 1 3
## 2 5
## 3 7
## dtype: int64

관련 함수 및 메서드

파이썬의 기본 함수를 Pandas 객체에도 사용할 수 있다.

1
2
3
4
5
6
7
8
max(ser)
## 7

min(ser)
## 1

sum(ser)
## 16

메서드를 사용한다면 다음과 같이 쓸 수 있다.

1
2
ser.mean()
## 4.0

수치연산을 위해 자주 사용하는 메서드를 정리하면 다음과 같다.
- .abs(): 절대값
- .round(): 반올림
- .min(): 최소값
- .max(): 최대값
- .mean(): 평균값
- .var(): 분산
- .std(): 표준편차
- .skew(): 왜도
- .kurt(): 첨도

시리즈(Series)

시리즈 객체 원소의 표준편차를 구하려면 다음과 같이 코드를 작성할 수 있다.

1
2
ser.std()
## 2.581988897471611

그런데 종종 이 표준편차 결과를 NumPy의 결과와 비교하여 그 결과를 의심하는 사람들이 있다. 사실 이 문제는 자유도(degree of freedom)에 관련한 것이며 이를 확인하기 위한 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
ser.std(ddof = 0)
## 2.23606797749979

import numpy as np
np.std(ser)
## 2.23606797749979

np.std(ser, ddof = 1)
## 2.581988897471611

상기와 같이 NumPy 라이브러리의 함수를 사용한 결과와 Pandas 객체의 메서드를 사용한 결과가 다를 경우 혹시 자유도의 문제가 아닌지 의심해보길 바란다.

그리고 보통 시리즈 객체의 산술연산은 해당 객체의 메서드를 사용하여 연산을 한다. 그런데 데이터분석을 하게되면 데이터프레임 객체의 특정 변수를 대상으로 산술연산을 하기에 별도의 시리즈 객체를 대상으로 연산을 수행하는 경우가 상대적으로 적다. 그래서 앞에서 준비한 “df” 데이터프레임 객체를 기반으로 알아보자.

1
2
3
4
5
6
7
8
df["price"].mean()
## 3932.799721913237

df["price"].max()
## 18823

df["price"].min()
## 326

데이터프레임의 경우 하나의 변수만 선택할 경우 기본적으로 시리즈가 반환되기 때문에 시리즈 객체의 메서드를 사용하는 것과 같다고 할 수 있다.

데이터프레임(DataFrame)

데이터프레임의 경우 산술연산 메서드를 사용하게 되면 기본적으로 열별(column-wise) 연산이 이루어지게 되는데 이와 관련된 인자는 “axis” 이다. 다음의 코드를 보자.

1
2
df_sub = df.loc[:4, ["x", "y", "z"]]
df_sub
x y z
0 3.95 3.98 2.43
1 3.89 3.84 2.31
2 4.05 4.07 2.31
3 4.20 4.23 2.63
4 4.34 4.35 2.75
1
2
3
4
5
6
7
8
9
10
11
12
13
df_sub.max()
## x 4.34
## y 4.35
## z 2.75
## dtype: float64

df_sub.max(axis = 1)
## 0 3.98
## 1 3.89
## 2 4.07
## 3 4.23
## 4 4.35
## dtype: float64

결과는 시리즈로 반환된다. “axis” 인자에 1이 할당된 경우 행별(row-wise) 연산 결과를 확인할 수 있다.

이렇게 데이터프레임의 열별/행별 연산을 실시하다보면 나중에 기본 제공되는 메서드가 아니라 별도의 복잡한 연산을 일괄로 적용하고 싶은 경우가 있다. 그 시점이 되면 비로소 .apply() 메서드와 lambda 함수를 배울 준비가 된 것이며 해당 내용은 Pandas(Apply) 게시물에서 다룬다.

Your browser is out-of-date!

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

×