여러 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)
'Programming > Python' 카테고리의 다른 글
[Pandas] row <-> col by melt, pivot and transpose (0) | 2023.08.30 |
---|---|
[Pandas] concat, merge로 데이터 연결 (SQL JOIN개념) (0) | 2023.08.30 |
[Pandas] Null(결측치) 다루기 (3) | 2023.08.30 |
[Pandas] Function application (1) | 2023.08.30 |
[Pandas] col, row 조작 및 변경 (1) | 2023.08.30 |