데이터프레임의 변수(column)별 데이터타입 확인은 중요하다. 그리고 변수 개수가 매우 많은 경우는 어떻게 처리할 수 있을까? 이와 관련해서 알아보도록 하자.
간단한 데이터프레임
우선 간단한 데이터프레임을 준비해보자.
1 2 3 4
| import pandas as pd df = pd.DataFrame([["A", 1], ["C", 2], ["B", 3], ["F", 4], ["D", 5]], columns = ["Rank", "Score"]) df
|
|
Rank |
Score |
0 |
A |
1 |
1 |
C |
2 |
2 |
B |
3 |
데이터프레임은 .info()
메서드로 column별 상세내용을 확인할 수 있으며 각 column의 dtype 또한 확인할 수 있다.
변수가 매우 많은 데이터프레임
하지만 변수 개수가 1000개가 넘어간다면 어떨까? 샘플링을 통해 임의의 데이터프레임을 만들어보자.
※ seed 고정을 하지 않았기 때문에 코드가 같더라도 생성되는 데이터프레임 원소는 다르다.
1 2 3 4 5 6 7 8 9 10 11 12
| df_col1 = pd.DataFrame() df_col2 = pd.DataFrame() for n in range(200): df_s1 = pd.DataFrame(["A", "B", 1, 2, 3]).sample(n = 5, replace = True) df_s2 = pd.DataFrame(["A", "B", 1, 2, 3]).sample(n = 5, replace = True) df_col1 = pd.concat([df_col1, df_s1]) df_col2 = pd.concat([df_col2, df_s2])
df_col = pd.concat([df_col1.reset_index(drop = True), df_col2.reset_index(drop = True)], axis = 1) df_col.head()
|
|
0 |
0 |
0 |
A |
2 |
1 |
2 |
2 |
2 |
1 |
2 |
3 |
A |
B |
4 |
A |
1 |
변수 개수가 많은 데이터프레임으로 바꿔주기 위해 .transpose()
메서드를 활용했으며, 데이터타입을 바꿔주는 코드를 별도로 작성하기 귀찮아서 파일을 임시 저장했다가 불러왔다.
1 2 3 4
| df_col_t = df_col.transpose().reset_index(drop = True) df_col_t.to_csv("test.csv", index = False) df_col_t = pd.read_csv("test.csv") df_col_t.head()
|
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
... |
992 |
993 |
994 |
995 |
996 |
997 |
998 |
999 |
0 |
A |
2 |
1 |
A |
A |
A |
3 |
B |
... |
A |
1 |
3 |
2 |
3 |
3 |
2 |
2 |
1 |
2 |
2 |
2 |
B |
1 |
2 |
2 |
3 |
... |
1 |
2 |
1 |
1 |
1 |
3 |
B |
1 |
각 변수의 데이터타입을 확인해보면 정수가 386개, object가 614개인 것을 알 수 있다. 하지만 어떤 변수가 정수인지 아닌지는 바로 알 수 없다는 단점이 있다.
더 나아가서 특정 데이터타입인 변수
.apply()
메서드와 lambda 함수를 활용하여 각 변수의 데이터타입을 뽑아 df_col_t_dtype 객체에 저장하고 이를 확인하면 다음과 같다.
1 2 3 4 5 6
| df_col_t_dtype = df_col_t.apply(lambda x: x.dtype) df_col_t_dtype.head(3)
|
df_col_t_dtype 를 활용하여 정수형 변수만 필터링하는 코드는 다음과 같다.
1 2 3
| col_int = pd.to_numeric(df_col_t_dtype[df_col_t_dtype == "int64"].index) df_col_t_int = df_col_t.iloc[:, col_int] df_col_t_int.head()
|
|
1 |
2 |
6 |
8 |
13 |
14 |
15 |
20 |
... |
989 |
990 |
993 |
994 |
995 |
996 |
997 |
999 |
0 |
2 |
1 |
3 |
2 |
3 |
3 |
3 |
2 |
... |
2 |
2 |
1 |
3 |
2 |
3 |
3 |
2 |
1 |
2 |
2 |
2 |
1 |
1 |
1 |
1 |
3 |
... |
1 |
1 |
2 |
1 |
1 |
1 |
3 |
1 |
1 2 3 4 5 6
| df_col_t_int.info()
|