🔥알림🔥
① 테디노트 유튜브 -
구경하러 가기!
② LangChain 한국어 튜토리얼
바로가기 👀
③ 랭체인 노트 무료 전자책 (wikidocs)
바로가기 🙌
④ RAG 비법노트 LangChain 강의오픈
바로가기 🙌
⑤ 서울대 PyTorch 딥러닝 강의
바로가기 🙌
이번 에피소드에서는 Pandas DataFrame의 row, column의 추가, 삭제, 컬럼간 연산, 타입의 변환 그리고 데이터 전처리 방법 에 대하여 다뤄 보도록 하겠습니다.
전처리 방법 파트에서는 datetime
데이터 타입을 활용하여 시간 데이터의 전처리 방법 그리고 Pandas에서 제공하는 유용한 기능에 대하여 알아보도록 하겠습니다.
타입 변환에서는 to_numeric
을 사용하여 수치형(numerical) 데이터로 변환하는 방법 과 자주 발생하는 오류에 대하여 알아보겠습니다.
그리고 마지막으로 cut
과 qcut
의 차이점에 대하여 살펴보고 이를 활용하여 연속된 수치형 데이터를 binning 하여 카테고리화 하는 방법 에 대해서도 다뤄보겠습니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
컬럼(columns) 설명
survivied: 생존여부 (1: 생존, 0: 사망)
pclass: 좌석 등급 (1등급, 2등급, 3등급)
sex: 성별
age: 나이
sibsp: 형제 + 배우자 수
parch: 부모 + 자녀 수
fare: 좌석 요금
embarked: 탑승 항구 (S, C, Q)
class: pclass와 동일
who: 성별과 동일
adult_male: 성인 남자 여부
deck: 데크 번호 (알파벳 + 숫자 혼용)
embark_town: 탑승 항구 이름
alive: 생존여부 (yes, no)
alone: 혼자 탑승 여부
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
임의의 값을 대입 하여 새로운 컬럼을 추가할 수 있습니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
VIP
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
True
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
True
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
True
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
True
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
True
삭제 삭제는 행(row) 삭제와 열(column) 삭제 로 구분할 수 있습니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
VIP
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
True
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
True
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
True
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
True
5
0
3
male
NaN
0
0
8.4583
Q
Third
man
True
NaN
Queenstown
no
True
True
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
886
0
2
male
27.0
0
0
13.0000
S
Second
man
True
NaN
Southampton
no
True
True
887
1
1
female
19.0
0
0
30.0000
S
First
woman
False
B
Southampton
yes
True
True
888
0
3
female
NaN
1
2
23.4500
S
Third
woman
False
NaN
Southampton
no
False
True
889
1
1
male
26.0
0
0
30.0000
C
First
man
True
C
Cherbourg
yes
True
True
890
0
3
male
32.0
0
0
7.7500
Q
Third
man
True
NaN
Queenstown
no
True
True
890 rows × 16 columns
행 삭제시 범위를 지정하여 삭제 할 수 있습니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
VIP
10
1
3
female
4.0
1
1
16.7000
S
Third
child
False
G
Southampton
yes
False
True
11
1
1
female
58.0
0
0
26.5500
S
First
woman
False
C
Southampton
yes
True
True
12
0
3
male
20.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
True
13
0
3
male
39.0
1
5
31.2750
S
Third
man
True
NaN
Southampton
no
False
True
14
0
3
female
14.0
0
0
7.8542
S
Third
child
False
NaN
Southampton
no
True
True
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
886
0
2
male
27.0
0
0
13.0000
S
Second
man
True
NaN
Southampton
no
True
True
887
1
1
female
19.0
0
0
30.0000
S
First
woman
False
B
Southampton
yes
True
True
888
0
3
female
NaN
1
2
23.4500
S
Third
woman
False
NaN
Southampton
no
False
True
889
1
1
male
26.0
0
0
30.0000
C
First
man
True
C
Cherbourg
yes
True
True
890
0
3
male
32.0
0
0
7.7500
Q
Third
man
True
NaN
Queenstown
no
True
True
881 rows × 16 columns
fancy indexing 을 활용하여 삭제할 수 있습니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
VIP
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
True
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
True
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
True
6
0
1
male
54.0
0
0
51.8625
S
First
man
True
E
Southampton
no
True
True
8
1
3
female
27.0
0
2
11.1333
S
Third
woman
False
NaN
Southampton
yes
False
True
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
886
0
2
male
27.0
0
0
13.0000
S
Second
man
True
NaN
Southampton
no
True
True
887
1
1
female
19.0
0
0
30.0000
S
First
woman
False
B
Southampton
yes
True
True
888
0
3
female
NaN
1
2
23.4500
S
Third
woman
False
NaN
Southampton
no
False
True
889
1
1
male
26.0
0
0
30.0000
C
First
man
True
C
Cherbourg
yes
True
True
890
0
3
male
32.0
0
0
7.7500
Q
Third
man
True
NaN
Queenstown
no
True
True
886 rows × 16 columns
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
VIP
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
True
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
True
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
True
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
True
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
True
열 삭제시 반드시 axis=1
옵션을 지정 해야 합니다. 2번째 위치에 지정시 axis=
을 생략할 수 있습니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
who
adult_male
deck
embark_town
alive
alone
VIP
0
0
3
male
22.0
1
0
7.2500
S
man
True
NaN
Southampton
no
False
True
1
1
1
female
38.0
1
0
71.2833
C
woman
False
C
Cherbourg
yes
False
True
2
1
3
female
26.0
0
0
7.9250
S
woman
False
NaN
Southampton
yes
True
True
3
1
1
female
35.0
1
0
53.1000
S
woman
False
C
Southampton
yes
False
True
4
0
3
male
35.0
0
0
8.0500
S
man
True
NaN
Southampton
no
True
True
survived
pclass
sex
age
sibsp
parch
fare
embarked
who
adult_male
deck
embark_town
alive
alone
VIP
0
0
3
male
22.0
1
0
7.2500
S
man
True
NaN
Southampton
no
False
True
1
1
1
female
38.0
1
0
71.2833
C
woman
False
C
Cherbourg
yes
False
True
2
1
3
female
26.0
0
0
7.9250
S
woman
False
NaN
Southampton
yes
True
True
3
1
1
female
35.0
1
0
53.1000
S
woman
False
C
Southampton
yes
False
True
4
0
3
male
35.0
0
0
8.0500
S
man
True
NaN
Southampton
no
True
True
다수의 컬럼(column) 삭제 도 가능합니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
adult_male
embark_town
alone
VIP
0
0
3
male
22.0
1
0
7.2500
S
Third
True
Southampton
False
True
1
1
1
female
38.0
1
0
71.2833
C
First
False
Cherbourg
False
True
2
1
3
female
26.0
0
0
7.9250
S
Third
False
Southampton
True
True
3
1
1
female
35.0
1
0
53.1000
S
First
False
Southampton
False
True
4
0
3
male
35.0
0
0
8.0500
S
Third
True
Southampton
True
True
...
...
...
...
...
...
...
...
...
...
...
...
...
...
886
0
2
male
27.0
0
0
13.0000
S
Second
True
Southampton
True
True
887
1
1
female
19.0
0
0
30.0000
S
First
False
Southampton
True
True
888
0
3
female
NaN
1
2
23.4500
S
Third
False
Southampton
False
True
889
1
1
male
26.0
0
0
30.0000
C
First
True
Cherbourg
True
True
890
0
3
male
32.0
0
0
7.7500
Q
Third
True
Queenstown
True
True
891 rows × 13 columns
삭제된 내용을 바로 적용하려면 inplace=True
를 지정합니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
adult_male
embark_town
alone
VIP
0
0
3
male
22.0
1
0
7.2500
S
Third
True
Southampton
False
True
1
1
1
female
38.0
1
0
71.2833
C
First
False
Cherbourg
False
True
2
1
3
female
26.0
0
0
7.9250
S
Third
False
Southampton
True
True
3
1
1
female
35.0
1
0
53.1000
S
First
False
Southampton
False
True
4
0
3
male
35.0
0
0
8.0500
S
Third
True
Southampton
True
True
컬럼간 연산 컬럼(column) 과 컬럼 사이의 연산을 매우 쉽게 적용 할 수 있습니다.
family(가족) 의 총합은 sibsp 컬럼과 parch 의 합산으로 구할 수 있습니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
family
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
1
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
1
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
0
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
1
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
0
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
family
gender
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
1
man-male
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
1
woman-female
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
0
woman-female
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
1
woman-female
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
0
man-male
컬럼간 연산시 round()
를 사용하여 소수점 자릿수를 지정할 수 있습니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
family
gender
round
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
1
man-male
0.33
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
1
woman-female
1.88
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
0
woman-female
0.30
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
1
woman-female
1.52
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
0
man-male
0.23
연산시 1개의 컬럼이라도 NaN 값을 포함하고 있다면 결과는 NaN 이 됩니다.
deck
embark_town
alive
alone
family
gender
round
5
NaN
Queenstown
no
True
0
man-male
NaN
17
NaN
Southampton
yes
True
0
man-male
NaN
19
NaN
Cherbourg
yes
True
0
woman-female
NaN
26
NaN
Cherbourg
no
True
0
man-male
NaN
28
NaN
Queenstown
yes
True
0
woman-female
NaN
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
survived 891 non-null int64
pclass 891 non-null int64
sex 891 non-null object
age 714 non-null float64
sibsp 891 non-null int64
parch 891 non-null int64
fare 891 non-null float64
embarked 889 non-null object
class 891 non-null category
who 891 non-null object
adult_male 891 non-null bool
deck 203 non-null category
embark_town 889 non-null object
alive 891 non-null object
alone 891 non-null bool
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.6+ KB
0 3
1 1
2 3
3 1
4 3
Name: pclass, dtype: int32
0 3.0
1 1.0
2 3.0
3 1.0
4 3.0
Name: pclass, dtype: float32
0 3
1 1
2 3
3 1
4 3
Name: pclass, dtype: object
category
로 변경.
category
로 변경시에는 Categories가 같이 출력 됩니다.
man 537
woman 271
child 83
Name: who, dtype: int64
0 man
1 woman
2 woman
3 woman
4 man
Name: who, dtype: category
Categories (3, object): [child, man, woman]
타입을 category
로 변환했다면 .cat 으로 접근하여 category 타입이 제공하는 attribute를 사용 할 수 있습니다.
CategoricalDtype(categories=['child', 'man', 'woman'], ordered=False)
0 1
1 2
2 2
3 2
4 1
..
886 1
887 2
888 2
889 1
890 1
Length: 891, dtype: int8
['Group (child)', 'Group (man)', 'Group (woman)']
Group (man) 537
Group (woman) 271
Group (child) 83
Name: who, dtype: int64
data_range 주요 옵션 값
start : 시작 날짜
end : 끝 날짜
periods : 생성할 데이터 개수
freq : 주기
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
date의 컬럼 을 만들어 생성한 date 를 대입 합니다.
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
date
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
2021-01-01 00:00:00
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
2021-01-01 15:00:00
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
2021-01-02 06:00:00
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
2021-01-02 21:00:00
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
2021-01-03 12:00:00
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 16 columns):
survived 891 non-null int64
pclass 891 non-null int64
sex 891 non-null object
age 714 non-null float64
sibsp 891 non-null int64
parch 891 non-null int64
fare 891 non-null float64
embarked 889 non-null object
class 891 non-null category
who 891 non-null object
adult_male 891 non-null bool
deck 203 non-null category
embark_town 889 non-null object
alive 891 non-null object
alone 891 non-null bool
date 891 non-null datetime64[ns]
dtypes: bool(2), category(2), datetime64[ns](1), float64(2), int64(4), object(5)
memory usage: 87.6+ KB
date 의 컬럼에 datetime64
라는 데이터 타입이 표기됩니다.
datetime 타입 datetime
타입에서는 dt 접근자로 다음과 같은 날짜 속성에 쉽게 접근할 수 있습니다.
Pandas의 dt (datetime) 날짜 관련 변수 는 다음과 같습니다.
pandas.Series.dt.year: 연도
pandas.Series.dt.month: 월
pandas.Series.dt.day: 일
pandas.Series.dt.hour: 시
pandas.Series.dt.minute: 분
pandas.Series.dt.second: 초
pandas.Series.dt.microsecond: micro 초
pandas.Series.dt.nanosecond: nano 초
pandas.Series.dt.week: 주
pandas.Series.dt.weekofyear: 연중 몇 째주
pandas.Series.dt.dayofweek: 요일
pandas.Series.dt.weekday: 요일 (dayofweek과 동일)
pandas.Series.dt.dayofyear: 연중 몇 번째 날
pandas.Series.dt.quarter: 분기
0 2021
1 2021
2 2021
3 2021
4 2021
Name: date, dtype: int64
0 1
1 1
2 1
3 1
4 1
Name: date, dtype: int64
0 1
1 1
2 2
3 2
4 3
Name: date, dtype: int64
dayofweek 는 숫자로 요일이 표기 됩니다.
0 4
1 4
2 5
3 5
4 6
5 0
6 0
7 1
8 2
9 2
Name: date, dtype: int64
샘플용 서울시 공공자전거 데이터를 로드 합니다.
대여일자
대여소번호
대여소명
대여구분코드
성별
연령대코드
이용건수
운동량
탄소량
이동거리
이용시간
0
Jan-20-2020
3
중랑센터
일일(회원)
M
AGE_003
3
61.82
0.52
2230.00
75
1
Jan-20-2020
3
중랑센터
일일(회원)
M
AGE_004
1
39.62
0.28
1220.00
15
2
Jan-20-2020
3
중랑센터
정기
M
AGE_005
3
430.85
4.01
17270.00
53
3
Jan-20-2020
5
상암센터 정비실
일일(회원)
\N
AGE_005
2
1.79
0.02
90.00
33
4
Jan-20-2020
5
상암센터 정비실
정기
F
AGE_003
1
4501.96
45.47
196010.00
64
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 327231 entries, 0 to 327230
Data columns (total 11 columns):
대여일자 327231 non-null object
대여소번호 327231 non-null int64
대여소명 327231 non-null object
대여구분코드 327231 non-null object
성별 272841 non-null object
연령대코드 327231 non-null object
이용건수 327231 non-null int64
운동량 327231 non-null object
탄소량 327231 non-null object
이동거리 327231 non-null float64
이용시간 327231 non-null int64
dtypes: float64(1), int64(3), object(7)
memory usage: 27.5+ MB
대여일자 컬럼은 날짜 관련 컬럼처럼 보이나 info()
는 object로 인식하였습니다.
datetime
타입으로 변경해야 .dt 접근자를 사용할 수 있습니다.
pd.to_datetime()
: datetime type으로 변환합니다.
0 2020-01-20
1 2020-01-20
2 2020-01-20
3 2020-01-20
4 2020-01-20
...
327226 2020-05-20
327227 2020-05-20
327228 2020-05-20
327229 2020-05-20
327230 2020-05-20
Name: 대여일자, Length: 327231, dtype: datetime64[ns]
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 327231 entries, 0 to 327230
Data columns (total 11 columns):
대여일자 327231 non-null datetime64[ns]
대여소번호 327231 non-null int64
대여소명 327231 non-null object
대여구분코드 327231 non-null object
성별 272841 non-null object
연령대코드 327231 non-null object
이용건수 327231 non-null int64
운동량 327231 non-null object
탄소량 327231 non-null object
이동거리 327231 non-null float64
이용시간 327231 non-null int64
dtypes: datetime64[ns](1), float64(1), int64(3), object(6)
memory usage: 27.5+ MB
적용된 후 .dt
접근자를 활용하여 datetime 속성에 접근할 수 있습니다.
0 0
1 0
2 0
3 0
4 0
..
327226 2
327227 2
327228 2
327229 2
327230 2
Name: 대여일자, Length: 327231, dtype: int64
0 0
1 0
2 0
3 0
4 0
..
327226 2
327227 2
327228 2
327229 2
327230 2
Name: 대여일자, Length: 327231, dtype: int64
0 0
1 0
2 0
3 0
4 0
..
327226 2
327227 2
327228 2
327229 2
327230 2
Name: 대여일자, Length: 327231, dtype: int64
pd.to_numeric() - 수치형 변환 object나 numerical type이 아닌 컬럼을 수치형(numerical) 컬럼으로 변환 할 때 사용합니다.
대여일자
대여소번호
대여소명
대여구분코드
성별
연령대코드
이용건수
운동량
탄소량
이동거리
이용시간
0
2020-01-20
3
중랑센터
일일(회원)
M
AGE_003
3
61.82
0.52
2230.00
75
1
2020-01-20
3
중랑센터
일일(회원)
M
AGE_004
1
39.62
0.28
1220.00
15
2
2020-01-20
3
중랑센터
정기
M
AGE_005
3
430.85
4.01
17270.00
53
3
2020-01-20
5
상암센터 정비실
일일(회원)
\N
AGE_005
2
1.79
0.02
90.00
33
4
2020-01-20
5
상암센터 정비실
정기
F
AGE_003
1
4501.96
45.47
196010.00
64
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 327231 entries, 0 to 327230
Data columns (total 11 columns):
대여일자 327231 non-null datetime64[ns]
대여소번호 327231 non-null int64
대여소명 327231 non-null object
대여구분코드 327231 non-null object
성별 272841 non-null object
연령대코드 327231 non-null object
이용건수 327231 non-null int64
운동량 327231 non-null object
탄소량 327231 non-null object
이동거리 327231 non-null float64
이용시간 327231 non-null int64
dtypes: datetime64[ns](1), float64(1), int64(3), object(6)
memory usage: 27.5+ MB
운동량 컬럼은 숫자형 컬럼 처럼 보이지만, object 타입으로 지정 되어 있습니다.
종종 이런 현상이 발생하는데, 이런 현상을 만들어낸 이유는 분명 존재합니다!
원인 파악을 위해서 일단 pd.to_numeric()
으로 변환을 시도 합니다.
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
pandas/_libs/lib.pyx in pandas._libs.lib.maybe_convert_numeric ()
ValueError : Unable to parse string "\N"
During handling of the above exception, another exception occurred:
ValueError Traceback (most recent call last)
<ipython-input-172-39aff29f75a7> in <module>
----> 1 pd. to_numeric( df2[ '운동량' ] )
/opt/conda/lib/python3.6/site-packages/pandas/core/tools/numeric.py in to_numeric (arg, errors, downcast)
149 coerce_numeric = errors not in ( "ignore" , "raise" )
150 values = lib.maybe_convert_numeric(
--> 151 values, set( ) , coerce_numeric= coerce_numeric
152 )
153
pandas/_libs/lib.pyx in pandas._libs.lib.maybe_convert_numeric ()
ValueError : Unable to parse string "\N" at position 2344
2344 position 에 무언가 에러가 발생하였습니다.
대여일자 2020-01-20 00:00:00
대여소번호 165
대여소명 165. 중앙근린공원
대여구분코드 일일(회원)
성별 \N
연령대코드 AGE_003
이용건수 1
운동량 \N
탄소량 \N
이동거리 0.00
이용시간 40
Name: 2344, dtype: object
운동량에 숫자형이 아닌 개행 (\N)이 들어가 있기 때문에 이러한 에러가 발생하였습니다.
숫자형으로 바꿀 때 NaN값이나 숫자로 변환이 불가능한 문자열이 존재할 때 변환에 실패 하게 됩니다.
errors=
옵션 값을 바꾸어 해결할 수 있습니다.
errors : {'ignore', 'raise', 'coerce'}, default 'raise'
- If 'raise', then invalid parsing will raise an exception
- If 'coerce', then invalid parsing will be set as NaN
- If 'ignore', then invalid parsing will return the input
errors='coerce'
로 지정하면 잘못된 문자열은 NaN 값으로 치환하여 변환 합니다.
그리고, 결과 확인시 잘 변환이 된 것을 볼 수 있습니다.
0 61.82
1 39.62
2 430.85
3 1.79
4 4501.96
...
327226 689.57
327227 0.00
327228 19.96
327229 43.77
327230 4735.63
Name: 운동량, Length: 327231, dtype: float64
errors='ignore'
로 지정하게 되면 잘못된 문자열이 숫자로 변환이 안되고 무시 하기 때문에 전체 컬럼의 dtype이 object로 그대로 남아있습니다.
0 61.82
1 39.62
2 430.85
3 1.79
4 4501.96
...
327226 689.57
327227 0
327228 19.96
327229 43.77
327230 4735.63
Name: 운동량, Length: 327231, dtype: object
재대입까지 마무리 해야 DataFrame에 적용됩니다.
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 327231 entries, 0 to 327230
Data columns (total 11 columns):
대여일자 327231 non-null datetime64[ns]
대여소번호 327231 non-null int64
대여소명 327231 non-null object
대여구분코드 327231 non-null object
성별 272841 non-null object
연령대코드 327231 non-null object
이용건수 327231 non-null int64
운동량 326830 non-null float64
탄소량 327231 non-null object
이동거리 327231 non-null float64
이용시간 327231 non-null int64
dtypes: datetime64[ns](1), float64(2), int64(3), object(5)
memory usage: 27.5+ MB
pd.cut() - 구간 나누기(binning) 연속된 수치(continuous values)를 구간으로 나누어 카테고리화 할 때 사용합니다.
대여일자
대여소번호
대여소명
대여구분코드
성별
연령대코드
이용건수
운동량
탄소량
이동거리
이용시간
0
2020-01-20
3
중랑센터
일일(회원)
M
AGE_003
3
61.82
0.52
2230.00
75
1
2020-01-20
3
중랑센터
일일(회원)
M
AGE_004
1
39.62
0.28
1220.00
15
2
2020-01-20
3
중랑센터
정기
M
AGE_005
3
430.85
4.01
17270.00
53
3
2020-01-20
5
상암센터 정비실
일일(회원)
\N
AGE_005
2
1.79
0.02
90.00
33
4
2020-01-20
5
상암센터 정비실
정기
F
AGE_003
1
4501.96
45.47
196010.00
64
대여소번호
이용건수
운동량
이동거리
이용시간
count
327231.00
327231.00
326830.00
327231.00
327231.00
mean
1288.41
23.62
6921.37
106881.09
752.81
std
1012.65
59.92
656482.34
463495.54
2647.38
min
3.00
1.00
0.00
0.00
0.00
25%
562.00
2.00
138.05
5290.00
66.00
50%
1204.00
6.00
601.71
22900.00
207.00
75%
1933.00
22.00
2481.17
93460.00
670.00
max
99999.00
7451.00
163936052.30
56709052.94
458960.00
운동량은 범위가 굉장히 넓습니다. 최소값은 0인데, 최대값은 엄청 큰 값 이 존재합니다.
어쨌든, 운동향을 기준으로 데이터를 10개 그룹으로 분류하고 싶습니다.
pd.cut()
을 활용하여 쉽게 그룹을 나눌 수 있습니다.
대여일자
대여소번호
대여소명
대여구분코드
성별
연령대코드
이용건수
운동량
탄소량
이동거리
이용시간
0
2020-01-20
3
중랑센터
일일(회원)
M
AGE_003
3
61.82
0.52
2230.00
75
1
2020-01-20
3
중랑센터
일일(회원)
M
AGE_004
1
39.62
0.28
1220.00
15
2
2020-01-20
3
중랑센터
정기
M
AGE_005
3
430.85
4.01
17270.00
53
3
2020-01-20
5
상암센터 정비실
일일(회원)
\N
AGE_005
2
1.79
0.02
90.00
33
4
2020-01-20
5
상암센터 정비실
정기
F
AGE_003
1
4501.96
45.47
196010.00
64
bins
옵션에 나누고자 하는 구간의 개수 를 설정합니다.
(-163936.052, 16393605.23] 326816
(98361631.38, 114755236.61] 9
(32787210.46, 49180815.69] 2
(147542447.07, 163936052.3] 1
(114755236.61, 131148841.84] 1
(16393605.23, 32787210.46] 1
(131148841.84, 147542447.07] 0
(81968026.15, 98361631.38] 0
(65574420.92, 81968026.15] 0
(49180815.69, 65574420.92] 0
Name: 운동량_cut, dtype: int64
분포를 보니 첫 구간에 대부분의 데이터가 쏠려 있습니다. 딱봐도 올바르지 않은 방법 같아 보입니다.
pd.cut()
은 최소에서 최대 구간을 지정한 bin만큼 동일하게 분할 하기 때문에 이런 현상이 발생할 수 있습니다.
고르게 분포한 데이터라면 괜찮지만, 튀는 이상치(outlier)가 있는 경우에는 안 좋은 결과 를 초래 합니다.
pd.qcut() - 동일한 갯수를 갖도록 구간 분할 pd.cut()
과 유사하지만, quantity 즉 데이터의 분포를 최대한 비슷하게 유지 하는 구간을 분할 합니다.
(93.414, 192.02] 32690
(6805.188, 163936052.3] 32683
(3328.186, 6805.188] 32683
(1889.606, 3328.186] 32683
(1079.744, 1889.606] 32683
(601.705, 1079.744] 32683
(24.737, 93.414] 32683
(-0.001, 24.737] 32683
(344.45, 601.705] 32680
(192.02, 344.45] 32679
Name: 운동량_qcut, dtype: int64
구간도 예쁘게 분할(균등하게 분할 )이 된 것 처럼 보입니다. 하지만, 간격은 일정하지 않습니다.
태그:
pandas ,
데이터 타입 ,
데이터프레임 ,
컬럼 삭제 ,
컬럼 추가 ,
타입 변환 ,
타입 변환 ,
파이썬 데이터 분석 ,
판다스 ,
판다스 자료구조 ,
판다스 튜토리얼 ,
행 삭제
카테고리:
pandas
업데이트: 2021년 01월 24일
댓글남기기