Py) 기초 - Pandas(객체 탐색)

Py) 기초 - Pandas(객체 탐색)

파이썬 기반 데이터분석을 위하여 Pandas 객체의 기본적인 객체 탐색을 알아보고자 한다.


개요

Pandas 라이브러리의 시리즈(Series) 또는 데이터프레임(DataFrame)이 있을 경우 원소는 몇 개가 있는지, 행과 열의 개수는 어떠한지, 데이터 유형은 어떠한지 등 필터링을 하기 이전에 여러 정보를 확인할 수 있다. 여기서는 그와 관련된 함수와 어트리뷰트가 어떤 것이 있는지 알아보고자 한다.

시리즈(Series)

다음과 같은 시리즈 객체를 준비한다.

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

“index” 어트리뷰트를 사용하여 시리즈 객체의 인덱스만 뽑아낼 수 있다.

1
2
ser.index
## RangeIndex(start=0, stop=4, step=1)

상기 인덱스는 좀 생소하게 보이나 이를 리스트로 변환하면 각 원소를 잘 볼 수 있다.

1
2
ser.index.to_list()
## [0, 1, 2, 3]

시리즈 객체의 값(value)은 “values” 어트리뷰트로 추출할 수 있다.

1
2
ser.values
## array([100, 200, 300, 400], dtype=int64)

“shape” 어트리뷰트는 객체의 각 차원의 길이를 반환하는데 시리즈 객체는 원소가 하나인 튜플을 반환하며 “ser” 객체의 원소가 4개이기 때문에 다음과 같은 결과를 확인할 수 있다.

1
2
ser.shape
## (4,)

기본함수인 len() 함수를 사용한다면 시리즈 객체의 길이(원소의 개수)를 확인할 수 있다.
len() 함수는 이전 포스팅에서 소개한바 있다.

1
2
len(ser)
## 4

시리즈 객체의 원소 유형(type)을 확인하려면 “.dtype” 또는 “.dtypes” 를 사용하면 되는데 둘 다 결과가 같아 둘 중 하나를 암기해도 되지만, 데이터프레임 객체에서는 “.dtype”는 에러가 발생하고(어트리뷰트가 없음) “.dtypes” 어트리뷰트로 각 변수별 원소 유형을 확인해야 하기에 “.dtypes” 를 암기하는 것을 권장한다.

1
2
3
4
5
ser.dtype
## dtype('int64')

ser.dtypes
## dtype('int64')

.describe() 메서드는 시리즈 객체의 각종 기술통계량을 반환한다.

1
2
3
4
5
6
7
8
9
10
ser.describe()
## count 4.000000
## mean 250.000000
## std 129.099445
## min 100.000000
## 25% 175.000000
## 50% 250.000000
## 75% 325.000000
## max 400.000000
## dtype: float64

상기 기술통계량은 시리즈 객체로 반환되기 때문에 인덱스 기반의 접근법을 사용하면 원하는 원소를 추출할 수 있다. 그리고 산출되는 모든 값은 시리즈에서 별도의 메서드(.quantile(), .std() 등)로 산출할 수 있으니 향후 해당 메서드를 숙지하면 되겠다. 일단 여기에서는 다음과 같은 코드를 작성할 수 있다.

1
2
ser.describe()["25%"]
## 175.0

Pandas 객체를 살펴볼 때 .describe() 메서드 보다는 .info() 메서드를 조금 더 많이 사용하지 않나 싶다. 그 예제는 다음과 같다.

1
2
3
4
5
6
7
8
9
ser.info()
## <class 'pandas.core.series.Series'>
## RangeIndex: 4 entries, 0 to 3
## Series name: None
## Non-Null Count Dtype
## -------------- -----
## 4 non-null int64
## dtypes: int64(1)
## memory usage: 160.0 bytes

다양한 정보와 더불어 메모리 점유용량까지 보여준다.

데이터프레임(DataFrame)

다음과 같은 데이터프레임 객체를 준비한다.

1
2
3
df = pd.DataFrame(dict(col1 = [50, 100, 150],
col2 = ["A", "B", "C"]))
df
col1 col2
0 50 A
1 100 B
2 150 C

데이터프레임 객체의 인덱스와 변수명은 각각 “.index”와 “.columns” 어트리뷰트로 추출할 수 있다.

1
2
3
4
5
df.index
## RangeIndex(start=0, stop=3, step=1)

df.columns
## Index(['col1', 'col2'], dtype='object')

그리고 데이터프레임 객체의 값은 “.values” 어트리뷰트로 추출할 수 있으며 그 결과는 NumPy 2차원 어레이 객체로 반환됨을 확인할 수 있다.

1
2
3
4
df.values
## array([[50, 'A'],
## [100, 'B'],
## [150, 'C']], dtype=object)

데이터프레임 객체의 행과 열의 개수는 앞에서 소개한 “.shape” 어트리뷰트로 확인할 수 있으며 첫 번째 원소가 행(row) 개수이고 두 번째 원소가 열(columns) 개수이다. 행 개수의 경우 len() 함수로 보다 짧은 코드로 확인할 수 있으나 열 개수는 튜플의 두 번쨰 원소를 추출하는 방식으로 사용하는게 가장 짧은 코드이다.

1
2
3
4
5
6
7
8
df.shape
## (3, 2)

len(df)
## 3

df.shape[1]
## 2

각 변수별 원소 유형을 확인하고자 할 경우 “.dtypes” 어트리뷰트를 쓸 수 있다. 그런데 .describe() 메서드를 “df”객체에 사용하면 첫 번째 원소에 대해서만 결과가 반환되는 것을 볼 수 있다.

1
2
3
4
5
6
df.dtypes
## col1 int64
## col2 object
## dtype: object

df.describe()
col1
count 3.0
mean 100.0
std 50.0
min 50.0
25% 75.0
50% 100.0
75% 125.0
max 150.0

사실 .describe() 메서드는 수치형 변수에 대해서 결과를 반환하기 때문에 숫자를 원소로 하는 첫 번째 변수에 대해 결과가 반환되었으며 다음과 같이 두 개의 수치형 변수가 있다면 변수가 두 개인 데이터프레임이 반환되는 것을 확인할 수 있다.

1
2
3
df2 = pd.DataFrame(dict(col1 = [50, 100, 150],
col2 = [3, 4, 5]))
df2.describe()
col1 col2
count 3.0 3.0
mean 100.0 4.0
std 50.0 1.0
min 50.0 3.0
25% 75.0 3.5
50% 100.0 4.0
75% 125.0 4.5
max 150.0 5.0

다시 “df” 객체로 돌아와서 데이터프레임 객체에서 .info() 메서드를 사용한 결과는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
df.info()
## <class 'pandas.core.frame.DataFrame'>
## RangeIndex: 3 entries, 0 to 2
## Data columns (total 2 columns):
## # Column Non-Null Count Dtype
## --- ------ -------------- -----
## 0 col1 3 non-null int64
## 1 col2 3 non-null object
## dtypes: int64(1), object(1)
## memory usage: 176.0+ bytes
Your browser is out-of-date!

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

×