기타


1
import pandas as pd
1
df = pd.read_csv("korean-idol.csv")
1
df.head()
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928


1. 데이터 타입별 column 선택 (select_dtypes)

1
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 8 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   이름       15 non-null     object 
 1   그룹       14 non-null     object 
 2   소속사      15 non-null     object 
 3   성별       15 non-null     object 
 4   생년월일     15 non-null     object 
 5   키        13 non-null     float64
 6   혈액형      15 non-null     object 
 7   브랜드평판지수  15 non-null     int64  
dtypes: float64(1), int64(1), object(6)
memory usage: 1.1+ KB

문자열이 있는 column만 선택 / 배제

  • df_name .select_dtypes (include = ‘object’)
  • df_name .select_dtypes (exclude = ‘object’)

(1) 문자열 column만 선택

1
df.select_dtypes(include = 'object')
이름 그룹 소속사 성별 생년월일 혈액형
0 지민 방탄소년단 빅히트 남자 1995-10-13 A
1 지드래곤 빅뱅 YG 남자 1988-08-18 A
2 강다니엘 NaN 커넥트 남자 1996-12-10 A
3 방탄소년단 빅히트 남자 1995-12-30 AB
4 화사 마마무 RBW 여자 1995-07-23 A
5 정국 방탄소년단 빅히트 남자 1997-09-01 A
6 민현 뉴이스트 플레디스 남자 1995-08-09 O
7 소연 아이들 큐브 여자 1998-08-26 B
8 방탄소년단 빅히트 남자 1992-12-04 O
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 A
10 태연 소녀시대 SM 여자 1989-03-09 A
11 차은우 아스트로 판타지오 남자 1997-03-30 B
12 백호 뉴이스트 플레디스 남자 1995-07-21 AB
13 JR 뉴이스트 플레디스 남자 1995-06-08 O
14 슈가 방탄소년단 빅히트 남자 1993-03-09 O

(2) 문자열 column 배제 (문자열이 아닌 column만 선택)

1
df.select_dtypes(exclude = 'object')
브랜드평판지수
0 173.6 10523260
1 177.0 9916947
2 180.0 8273745
3 178.0 8073501
4 162.1 7650928
5 178.0 5208335
6 182.3 4989792
7 NaN 4668615
8 179.2 4570308
9 167.1 4036489
10 NaN 3918661
11 183.0 3506027
12 175.0 3301654
13 176.0 3274137
14 174.0 2925442

문자열이 포함된 DataFrame의 연산으로 발생되는 Error문제는 이 방법을 이용하여 해결할 수 있다

1
df + 10
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

D:\Anaconda\lib\site-packages\pandas\core\ops\array_ops.py in na_arithmetic_op(left, right, op, str_rep)
    148     try:
--> 149         result = expressions.evaluate(op, str_rep, left, right)
    150     except TypeError:


D:\Anaconda\lib\site-packages\pandas\core\computation\expressions.py in evaluate(op, op_str, a, b, use_numexpr)
    207     if use_numexpr:
--> 208         return _evaluate(op, op_str, a, b)
    209     return _evaluate_standard(op, op_str, a, b)


D:\Anaconda\lib\site-packages\pandas\core\computation\expressions.py in _evaluate_numexpr(op, op_str, a, b)
    120     if result is None:
--> 121         result = _evaluate_standard(op, op_str, a, b)
    122 


D:\Anaconda\lib\site-packages\pandas\core\computation\expressions.py in _evaluate_standard(op, op_str, a, b)
     69     with np.errstate(all="ignore"):
---> 70         return op(a, b)
     71 


TypeError: can only concatenate str (not "int") to str


1
df.select_dtypes(exclude = 'object') + 10
브랜드평판지수
0 183.6 10523270
1 187.0 9916957
2 190.0 8273755
3 188.0 8073511
4 172.1 7650938
5 188.0 5208345
6 192.3 4989802
7 NaN 4668625
8 189.2 4570318
9 177.1 4036499
10 NaN 3918671
11 193.0 3506037
12 185.0 3301664
13 186.0 3274147
14 184.0 2925452

(3) “문자열 column” / “비문자열 column” 의 column명을 추출

1
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 8 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   이름       15 non-null     object 
 1   그룹       14 non-null     object 
 2   소속사      15 non-null     object 
 3   성별       15 non-null     object 
 4   생년월일     15 non-null     object 
 5   키        13 non-null     float64
 6   혈액형      15 non-null     object 
 7   브랜드평판지수  15 non-null     int64  
dtypes: float64(1), int64(1), object(6)
memory usage: 1.1+ KB

1
2
obj_cols = df.select_dtypes(include = 'object').columns
obj_cols
Index(['이름', '그룹', '소속사', '성별', '생년월일', '혈액형'], dtype='object')

1
2
num_cols = df.select_dtypes(exclude = 'object').columns
num_cols
Index(['키', '브랜드평판지수'], dtype='object')

1
df[num_cols]
브랜드평판지수
0 173.6 10523260
1 177.0 9916947
2 180.0 8273745
3 178.0 8073501
4 162.1 7650928
5 178.0 5208335
6 182.3 4989792
7 NaN 4668615
8 179.2 4570308
9 167.1 4036489
10 NaN 3918661
11 183.0 3506027
12 175.0 3301654
13 176.0 3274137
14 174.0 2925442



2. One-hot-encoding (원핫인코딩)

One-hot-encoding: Categorical data를 dummy data로 변환시키는 방법

  • Dummy data로 변환 시 한개의 요소는 True (1) 로, 나머지 요소는 Flase (0) 로 변환시킨다

pd.get_dummies (df_name [ ‘col_name’ ], prefix = “…”)

  • prefix: dummy data 로 분리된 새 column들의 column name에 접두사 붙이기

1
df['혈액형']
0      A
1      A
2      A
3     AB
4      A
5      A
6      O
7      B
8      O
9      A
10     A
11     B
12    AB
13     O
14     O
Name: 혈액형, dtype: object

1
pd.get_dummies(df['혈액형'])
A AB B O
0 1 0 0 0
1 1 0 0 0
2 1 0 0 0
3 0 1 0 0
4 1 0 0 0
5 1 0 0 0
6 0 0 0 1
7 0 0 1 0
8 0 0 0 1
9 1 0 0 0
10 1 0 0 0
11 0 0 1 0
12 0 1 0 0
13 0 0 0 1
14 0 0 0 1

1
pd.get_dummies(df['혈액형'], prefix = '혈액형')
혈액형_A 혈액형_AB 혈액형_B 혈액형_O
0 1 0 0 0
1 1 0 0 0
2 1 0 0 0
3 0 1 0 0
4 1 0 0 0
5 1 0 0 0
6 0 0 0 1
7 0 0 1 0
8 0 0 0 1
9 1 0 0 0
10 1 0 0 0
11 0 0 1 0
12 0 1 0 0
13 0 0 0 1
14 0 0 0 1

categorical data의 각 카테고리가 숫자형식으로 표현됐을 때 one-hot-encoding이 더 중요해지는 이유:

  • categorical data의 각 카테고리를 상징하는 숫자들은 그저 분류의 의미를 가질 뿐, 숫자의 크기 자체는 아무 의미도 없고, 숫자들의 연산도 역시 무의미하다.
  • 하지만 이를 one-hot-encoding 작업 없이 머신러닝 알고리즘에 바로 넣으면 컴퓨터가 이 숫자들을 대소비교가 가능하고 연산이 가능하는 "숫자"로 인식하게 되므로 카테고리 간에 잘못된 관계를 맺을 수 있음.
  • 따라서 이런 경우에는 one-hot-encoding 작업이 꼭 필요하다

1
df.head()
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928

1
2
3
4
5
6
blood_map = {
'A': 0,
'B': 1,
'AB': 2,
'O': 3,
}
1
df["혈액형_code"] = df["혈액형"].map(blood_map)
1
df.head()
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 혈액형_code
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 0
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 0
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 2
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 0

1
df["혈액형_code"].value_counts()
0    7
3    4
2    2
1    2
Name: 혈액형_code, dtype: int64

1
df["혈액형_code"]
0     0
1     0
2     0
3     2
4     0
5     0
6     3
7     1
8     3
9     0
10    0
11    1
12    2
13    3
14    3
Name: 혈액형_code, dtype: int64

1
pd.get_dummies(df[ "혈액형_code" ])
0 1 2 3
0 1 0 0 0
1 1 0 0 0
2 1 0 0 0
3 0 0 1 0
4 1 0 0 0
5 1 0 0 0
6 0 0 0 1
7 0 1 0 0
8 0 0 0 1
9 1 0 0 0
10 1 0 0 0
11 0 1 0 0
12 0 0 1 0
13 0 0 0 1
14 0 0 0 1

1
pd.get_dummies(df["혈액형_code"], prefix = "혈액형")
혈액형_0 혈액형_1 혈액형_2 혈액형_3
0 1 0 0 0
1 1 0 0 0
2 1 0 0 0
3 0 0 1 0
4 1 0 0 0
5 1 0 0 0
6 0 0 0 1
7 0 1 0 0
8 0 0 0 1
9 1 0 0 0
10 1 0 0 0
11 0 1 0 0
12 0 0 1 0
13 0 0 0 1
14 0 0 0 1