본문 바로가기
Programming/Python

[Pandas] type 확인 및 변환

여러 type 혼합된 데이터 -> object

정수와 실수 -> float64

 

예제) 모든 type 총 정리

df = pd.DataFrame({'float': [1.0, 2.0],          #실수   (float 64)
                    'int': [1,2],                #정수   (int 64)
                    'datetime': [pd.Timestamp('20200101'),pd.Timestamp('20210101')], #날짜 시간
                    'string': ['a','b'],         #문자열
                    'bool':[True,False],         #불
                    'object':[1,'-'],            #혼합
                    'float2' : [1.0, 2]})        #정수 + 실수 -> 실수  (float 64)
df
df.types   # df형태의 자료형 확인

float              float64

int                  int64
datetime    datetime64[ns]
string              object
bool                  bool
object              object
float2             float64
dtype: object

 

혼합된 데이터의 특정 부분의 자료형 확인

type(df.loc[0,'object'])

int

 

 

print(df.loc[1,'object'])
print(type(df.loc[1,'object']))

-

<class 'str'>

 

 

<<기존 자료형 변환하기>>

df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})  # 샘플 데이터
df 
df.dtypes

col1    int64
col2    int64

dtype: object

 

 

[기존 자료형 전체변환]  df.astype('type형태')

df = df.astype('float64')   # 실수형으로 변환 
df.dtypes                   # 이 경우, 1 -> 1.0 이렇게 정수가 실수형으로 표기됨.
 
df = df.astype('str')       # 문자열로 변환
df.dtypes                   # 표기 변화 없음

df = df.astype('float').astype('int')   # 정수형으로 변환
df.dtypes                               # 이 경우, 1.0 -> 1로 다시 정수형 표현

[기존 컬럼의 자료형 변환] 

df['col2'] = df['col2'].astype('str')      # col2의 자료형만 str로 변환
df.dtypes    # 'str'부분을 'float', 'int'로 전부 다 可

[기존 자료 중, 혼합 컬럼 자료형 변환]  col3에 [5, '-'] 있는 df라면 col3 type은 object로 조회됨.

df['col3'] = df['col3'].astype('str')   # col3 컬럼을 str형으로 변환 可
type(df.loc[0,'col3'])                  # 그러나 int로 변경할 수 없다. (error)

 

int로 바꾸기위해 에러를 극복하려면 다음과 같은 방법을 사용.

  • pd.to_numeric(컬럼, errors='ignore') : 숫자로 변경할 수 없는 값이 있으면 작업하지 않음
s2 = pd.Series(['1.0', '2', -3, 'a'])
pd.to_numeric(s2, errors='ignore')

0    1.0
1      2
2     -3
3      a
dtype: object

 

  • pd.to_numeric(컬럼, errors='coerce') : 숫자로 변경할 수 없는 값이 NaN으로 설정
pd.to_numeric(s2, errors='coerce')

0    1.0
1    2.0
2   -3.0
3    NaN
dtype: float64

  • pd.to_numeric(컬럼, errors='raise') : 숫자로 변경할 수 없는 값이 있으면 에러발생(default)
pd.to_numeric(s2, errors='raise')

pd.to_numeric(s2)        # 동일결과 출력(default)
  • pd.to_datetime(컬럼): 날짜, 시간형태 데이터로 변경
df['출생'] = df['출생'].astype('datetime64')

df['사망'] = pd.to_datetime(df['사망'])      # 이렇게 재 정의해야 반영됨

astype이나 to_datetime 사용한다. (출력물 동일)

 

 

import datetime as dt  # datetime 다룰때 많이쓰는 패키지

 

 

[특정 시간정보 추출하기]

  • 컬럼.dt.year      ex)  df['birth'][0].year   -> 1989만 출력.      df['birth'].dt.year -> 전체 열의 연도만 출력
  • 컬럼.dt.month
  • 컬럼.dt.day
  • 컬럼.dt.quarter   -> 분기

 

 

strptime: 문자열(날짜,시간형식) -> datetime type

strftime: datetime type -> 문자열(날짜,시간형식)

df['분기']=df['birth'].dt.quarter    # 분기 컬럼 만들기
df
  • 컬럼.dt.strftime('%a') : 요약된 요일이름
  • 컬럼.dt.strftime('%A') : 긴 요일이름
  • 컬럼.dt.strftime('%w') : 숫자요일(0:일요일)
  • 컬럼.dt.strftime('%b') : 요약된 월이름
  • 컬럼.dt.strftime('%B') : 긴 월이름

striftime뒤 ()에서 형식 지정 可

now = datetime.datetime.now()

date = now.strftime('%Y-%m-%d')
print(date)      # 2021-04-08
 
time = now.strftime('%H:%M:%S')
print(time)      # 21:28:20
 
datetime = now.strftime('%Y-%m-%d %H:%M:%S')
print(datetime)  # 2021-04-08 21:28:20

%y : 두 자리 수의 연도 ex) 19, 20, 21

%Y : 네 자리 수의 연도 ex) 2019, 2020, 2021

%m : 0을 채운 두 자리 수의 월 ex) 01, 02 ...  11 ,12

%d : 0을 채운 두 자리 수의 일 ex) 01, 02 ...  30, 31

%I : 0을 채운 12시간제의 시간 ex) 01, 02 … 12

%H : 0을 채운 24시간제의 시간 ex) 00, 01 … 23

%M : 0을 채운 두 자리 수의 분 ex) 00, 01 ... 58, 59

%S : 0을 채운 두 자리 수의 초 ex) 00, 01 ... 58, 59

 

 

 

 

 

 

[문제풀이]

 

 

 

 

 

 

 

 

 

>>> 카테고리형 자료 다루기

 

 

df.info()   # 데이터 용량 확인하기 (info)

df.dropna(inplace=True)  # 결측치가 있는 행 삭제하기

df.isnull().sum()  # 결측치 확인(isnull)

info로 확인해서 기존 용량과 카테고리형으로 변환한후 용량을 비교해보면 카테고리 변환이

데이터 용량을 줄여줌을 알 수 있다.

 

 

df['average'] = round((df.kor+df.eng+df.math)/3,1)        #평균점수 칼럼 추가

def get_grade(x):
    if x>=90:
        return 1
    elif x>=80:
        return 2
    elif x>=70:
        return 3
    elif x>=60:
        return 4
    else:
        return 5
    
df['grade'] = df['average'].apply(get_grade)      # 등급제 표현 함수 적용

등급칼럼 'grade'를 astype 이용하여 카테고리형으로 변환  

df['grade'] = df['grade'].astype('category')
df.dtypes

name         object
kor         float64
eng         float64
math        float64
average     float64
grade      category
dtype: object

 

  • 컬럼.cat.categories = 카테고리리스트   : 카테고리 이름 바꾸기

 

기존 함수는 등급을 1 2 3 4로 표기하였다.

df['grade'].dtype

CategoricalDtype(categories=[1, 2, 3, 4], ordered=False)

 

해당 코드 결과에서도 1 , 2, 3, 4로 표현됨. 이를 다른 표현으로 바꾸려면 cat.categories를 사용한다.

 

df['grade'].cat.categories = ['A','B','C','D']

 

여기서 누락된 부분을 추가하고 싶다면 cat.set_categories를 사용한다.

df['grade'] = df['grade'].cat.set_categories(['A','B','C','D','F'])
df['grade'].dtypes

CategoricalDtype(categories=['A', 'B', 'C', 'D', 'F'], ordered=False)

728x90
반응형