파이썬 기반 데이터분석을 위하여 Pandas 객체의 기본적인 객체 탐색을 알아보고자 한다.
개요
Pandas 라이브러리의 시리즈(Series) 또는 데이터프레임(DataFrame)이 있을 경우 원소는 몇 개가 있는지, 행과 열의 개수는 어떠한지, 데이터 유형은 어떠한지 등 필터링을 하기 이전에 여러 정보를 확인할 수 있다. 여기서는 그와 관련된 함수와 어트리뷰트가 어떤 것이 있는지 알아보고자 한다.
시리즈(Series)
다음과 같은 시리즈 객체를 준비한다.
1 | ser = pd.Series([100, 200, 300, 400]) |
“index” 어트리뷰트를 사용하여 시리즈 객체의 인덱스만 뽑아낼 수 있다.
1 | ser.index |
상기 인덱스는 좀 생소하게 보이나 이를 리스트로 변환하면 각 원소를 잘 볼 수 있다.
1 | ser.index.to_list() |
시리즈 객체의 값(value)은 “values” 어트리뷰트로 추출할 수 있다.
1 | ser.values |
“shape” 어트리뷰트는 객체의 각 차원의 길이를 반환하는데 시리즈 객체는 원소가 하나인 튜플을 반환하며 “ser” 객체의 원소가 4개이기 때문에 다음과 같은 결과를 확인할 수 있다.
1 | ser.shape |
기본함수인 len()
함수를 사용한다면 시리즈 객체의 길이(원소의 개수)를 확인할 수 있다.
※ len()
함수는 이전 포스팅에서 소개한바 있다.
1 | len(ser) |
시리즈 객체의 원소 유형(type)을 확인하려면 “.dtype” 또는 “.dtypes” 를 사용하면 되는데 둘 다 결과가 같아 둘 중 하나를 암기해도 되지만, 데이터프레임 객체에서는 “.dtype”는 에러가 발생하고(어트리뷰트가 없음) “.dtypes” 어트리뷰트로 각 변수별 원소 유형을 확인해야 하기에 “.dtypes” 를 암기하는 것을 권장한다.
1 | ser.dtype |
.describe()
메서드는 시리즈 객체의 각종 기술통계량을 반환한다.
1 | ser.describe() |
상기 기술통계량은 시리즈 객체로 반환되기 때문에 인덱스 기반의 접근법을 사용하면 원하는 원소를 추출할 수 있다. 그리고 산출되는 모든 값은 시리즈에서 별도의 메서드(.quantile(), .std() 등)로 산출할 수 있으니 향후 해당 메서드를 숙지하면 되겠다. 일단 여기에서는 다음과 같은 코드를 작성할 수 있다.
1 | ser.describe()["25%"] |
Pandas 객체를 살펴볼 때 .describe()
메서드 보다는 .info()
메서드를 조금 더 많이 사용하지 않나 싶다. 그 예제는 다음과 같다.
1 | ser.info() |
다양한 정보와 더불어 메모리 점유용량까지 보여준다.
데이터프레임(DataFrame)
다음과 같은 데이터프레임 객체를 준비한다.
1 | df = pd.DataFrame(dict(col1 = [50, 100, 150], |
col1 | col2 | |
---|---|---|
0 | 50 | A |
1 | 100 | B |
2 | 150 | C |
데이터프레임 객체의 인덱스와 변수명은 각각 “.index”와 “.columns” 어트리뷰트로 추출할 수 있다.
1 | df.index |
그리고 데이터프레임 객체의 값은 “.values” 어트리뷰트로 추출할 수 있으며 그 결과는 NumPy 2차원 어레이 객체로 반환됨을 확인할 수 있다.
1 | df.values |
데이터프레임 객체의 행과 열의 개수는 앞에서 소개한 “.shape” 어트리뷰트로 확인할 수 있으며 첫 번째 원소가 행(row) 개수이고 두 번째 원소가 열(columns) 개수이다. 행 개수의 경우 len()
함수로 보다 짧은 코드로 확인할 수 있으나 열 개수는 튜플의 두 번쨰 원소를 추출하는 방식으로 사용하는게 가장 짧은 코드이다.
1 | df.shape |
각 변수별 원소 유형을 확인하고자 할 경우 “.dtypes” 어트리뷰트를 쓸 수 있다. 그런데 .describe()
메서드를 “df”객체에 사용하면 첫 번째 원소에 대해서만 결과가 반환되는 것을 볼 수 있다.
1 | df.dtypes |
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 | df2 = pd.DataFrame(dict(col1 = [50, 100, 150], |
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 | df.info() |