[Python 데이터 분석] 파이썬 카테고리 타입 및 cut을 이용한 범위 나누기(Python Category, cut method)

2021. 3. 27. 03:20 Python/파이썬 데이터 분석

 

| 파이썬 카테고리 타입 및 cut을 이용한 범위 나누기

 

파이썬에서는 데이터프레임(DataFrame)을 이루는 시리즈(Series) 타입 자료구조를 카테고리 타입(Category Type)으로 캐스팅하여 데이터 분석에 용이하게 쓸 수 있도록 할 수 있습니다. 또한 cut 메서드를 사용하여 데이터를 특정한 값의 범위로 나누어 그룹화하는 것도 가능합니다.

 

아래는 그에 대한 예제를 모아놓은 것입니다.

 

census.csv
2.06MB

 

import pandas as pd
import numpy as np

df = pd.DataFrame(['A+', 'A', 'A-', 'B+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D'],
                  index=['excellent', 'excellent', 'excellent', 'good', 'good', 'good', 'ok', 'ok', 'ok', 'poor', 'poor'])
df.rename(columns={0: 'Grades'}, inplace=True)
print(df)
'''
          Grades
excellent     A+
excellent      A
excellent     A-
good          B+
good           B
good          B-
ok            C+
ok             C
ok            C-
poor          D+
poor           D
'''
# category 타입으로 타입 캐스팅
df_head = df['Grades'].astype('category').head()
print(df_head)
'''
Categories (11, object): [A, A+, A-, B, ..., C+, C-, D, D+]
'''
# 순서가 있는 category 타입으로 타입 캐스팅
grades = df['Grades'].astype('category',
                             categories=['D', 'D+', 'C-', 'C', 'C+', 'B-', 'B', 'B+', 'A-', 'A', 'A+'],
                             ordered=True)
print(grades.head())
'''
excellent    A+
excellent     A
excellent    A-
good         B+
good          B
Name: Grades, dtype: category
'''
print(grades > 'C')
'''
excellent     True
excellent     True
excellent     True
good          True
good          True
good          True
ok            True
ok           False
ok           False
poor         False
poor         False
Name: Grades, dtype: bool
'''
df = pd.read_csv('census.csv')
df = df[df['SUMLEV']==50]
df = df.set_index('STNAME').groupby(level=0)['CENSUS2010POP'].agg({'avg':np.average})
# 현재 있는 값들의 분포를 10등분하여 보여줌
# 히스토그램에서 각각의 값들을 특정 범위마다 집어넣는 것이라 생각하면 됨
print(pd.cut(df['avg'], 10))
print(df)
'''
STNAME
Alabama                   (11706.087, 75333.413]
Alaska                    (11706.087, 75333.413]
Arizona                 (390320.176, 453317.529]
Arkansas                  (11706.087, 75333.413]
California              (579312.234, 642309.586]
Colorado                 (75333.413, 138330.766]
Connecticut             (390320.176, 453317.529]
Delaware                (264325.471, 327322.823]
District of Columbia    (579312.234, 642309.586]
Florida                 (264325.471, 327322.823]
Georgia                   (11706.087, 75333.413]
Hawaii                  (264325.471, 327322.823]
Idaho                     (11706.087, 75333.413]
Illinois                 (75333.413, 138330.766]
Indiana                   (11706.087, 75333.413]
Iowa                      (11706.087, 75333.413]
Kansas                    (11706.087, 75333.413]
Kentucky                  (11706.087, 75333.413]
Louisiana                 (11706.087, 75333.413]
Maine                    (75333.413, 138330.766]
Maryland                (201328.118, 264325.471]
Massachusetts           (453317.529, 516314.881]
Michigan                 (75333.413, 138330.766]
Minnesota                 (11706.087, 75333.413]
Mississippi               (11706.087, 75333.413]
Missouri                  (11706.087, 75333.413]
Montana                   (11706.087, 75333.413]
Nebraska                  (11706.087, 75333.413]
Nevada                  (138330.766, 201328.118]
New Hampshire            (75333.413, 138330.766]
New Jersey              (390320.176, 453317.529]
New Mexico                (11706.087, 75333.413]
New York                (264325.471, 327322.823]
North Carolina           (75333.413, 138330.766]
North Dakota              (11706.087, 75333.413]
Ohio                     (75333.413, 138330.766]
Oklahoma                  (11706.087, 75333.413]
Oregon                   (75333.413, 138330.766]
Pennsylvania            (138330.766, 201328.118]
Rhode Island            (201328.118, 264325.471]
South Carolina           (75333.413, 138330.766]
South Dakota              (11706.087, 75333.413]
Tennessee                 (11706.087, 75333.413]
Texas                    (75333.413, 138330.766]
Utah                     (75333.413, 138330.766]
Vermont                   (11706.087, 75333.413]
Virginia                  (11706.087, 75333.413]
Washington              (138330.766, 201328.118]
West Virginia             (11706.087, 75333.413]
Wisconsin                (75333.413, 138330.766]
Wyoming                   (11706.087, 75333.413]
Name: avg, dtype: category
Categories (10, interval[float64]): [(11706.087, 75333.413] < (75333.413, 138330.766] <
                                     (138330.766, 201328.118] < (201328.118, 264325.471] < ... <
                                     (390320.176, 453317.529] < (453317.529, 516314.881] <
                                     (516314.881, 579312.234] < (579312.234, 642309.586]]
'''
s = pd.Series([168, 180, 174, 190, 170, 185, 179, 181, 175, 169, 182, 177, 180, 171])
print(pd.cut(s,3))
'''
0     (167.978, 175.333]
1     (175.333, 182.667]
2     (167.978, 175.333]
3       (182.667, 190.0]
4     (167.978, 175.333]
5       (182.667, 190.0]
6     (175.333, 182.667]
7     (175.333, 182.667]
8     (167.978, 175.333]
9     (167.978, 175.333]
10    (175.333, 182.667]
11    (175.333, 182.667]
12    (175.333, 182.667]
13    (167.978, 175.333]
dtype: category
Categories (3, interval[float64]): [(167.978, 175.333] < (175.333, 182.667] < (182.667, 190.0]]
'''
# 각 특정 범위에 라벨을 달아서 표시하는 것도 가능
print(pd.cut(s,3,labels=['Small', 'Medium', 'Large']))
'''
0      Small
1     Medium
2      Small
3      Large
4      Small
5      Large
6     Medium
7     Medium
8      Small
9      Small
10    Medium
11    Medium
12    Medium
13     Small
dtype: category
Categories (3, object): [Small < Medium < Large]

 

 

참고자료 : https://www.coursera.org/learn/python-data-analysis



출처: https://engkimbs.tistory.com/725?category=763908 [새로비]