[Pandas 기초] 데이터프레임의 열(column)재구성

업데이트:

1. 열 순서 변경 : DataFrame객체[열이름의 리스트]

열의 순서를 변경하는건 생각보다 간단하다. 원리는 열 인덱싱을 내가 원하는 열 순서로 한 후에, 그걸 새로운 객체에 입력해주면 되는 것이다.

import seaborn as sns
titanic = sns.load_dataset('titanic')
df = titanic.loc[0:4, 'survived':'age']
print(df)
[Output]
   survived  pclass     sex   age
0         0       3    male  22.0
1         1       1  female  38.0
2         1       3  female  26.0
3         1       1  female  35.0
4         0       3    male  35.0 

보기 쉽게 컬렴명을 sorting해서 열 순서를 바꿔보자

columns = list(df.columns)
print(columns, '\n')

srt_col = sorted(columns)
print(srt_col, '\n')

df_srt = df[srt_col]
print(df_srt)
[Output]
['survived', 'pclass', 'sex', 'age'] 

['age', 'pclass', 'sex', 'survived'] 

    age  pclass     sex  survived
0  22.0       3    male         0
1  38.0       1  female         1
2  26.0       3  female         1
3  35.0       1  female         1
4  35.0       3    male         0

reversed()함수를 이용해 역순으로 정렬도 해볼 수 있고,

rvs_col = list(reversed(columns))
print(rvs_col, '\n')
df_rvs = df[rvs_col]
print(df_rvs)
[Output]
['age', 'sex', 'pclass', 'survived'] 

    age     sex  pclass  survived
0  22.0    male       3         0
1  38.0  female       1         1
2  26.0  female       3         1
3  35.0  female       1         1
4  35.0    male       3         0

2. 열분리 : Series객체.str.get(인덱스)

데이터를 하나 불러오고 자료형을 확인하자

import pandas as pd
df = pd.read_excel("~/주가데이터.xlsx")
print(df.head(), '\n')
print(df.dtypes, '\n')
[Output]
         연월일   당일종가  전일종가     시가     고가     저가     거래량
0 2018-07-02  10100   600  10850  10900  10000  137977
1 2018-06-29  10700   300  10550  10900   9990  170253
2 2018-06-28  10400   500  10900  10950  10150  155769
3 2018-06-27  10900   100  10800  11050  10500  133548
4 2018-06-26  10800   350  10900  11000  10700   63039 

연월일     datetime64[ns]
당일종가             int64
전일종가             int64
시가               int64
고가               int64
저가               int64
거래량              int64
dtype: object 

문자열 분리를 통한 열 재구성을 위해 astype함수를 이용해 ‘연월일’열을 datetime(시계열자료형)이 아니라 문자형(str)으로 변환하자.

그리고 split()함수로 ‘-‘를 기준으로 문자열을 분리한다.

df['연월일'] = df['연월일'].astype('str')
dates = df['연월일'].str.split('-')
print(dates.head())
[Output]
0    [2018, 07, 02]
1    [2018, 06, 29]
2    [2018, 06, 28]
3    [2018, 06, 27]
4    [2018, 06, 26]
Name: 연월일, dtype: object

dates변수는 위와 같이 짤려진 리스트를 개별원소로 갖는 시리즈객체이다.
여기에 str.get()함수를 이용하면 각 행별로 인덱싱이 가능하다.

df['연'] = dates.str.get(0)
df['월'] = dates.str.get(1)
df['일'] = dates.str.get(2)
df.head()
연월일 당일종가 전일종가 시가 고가 저가 거래량
0 2018-07-02 10100 600 10850 10900 10000 137977 2018 07 02
1 2018-06-29 10700 300 10550 10900 9990 170253 2018 06 29
2 2018-06-28 10400 500 10900 10950 10150 155769 2018 06 28
3 2018-06-27 10900 100 10800 11050 10500 133548 2018 06 27
4 2018-06-26 10800 350 10900 11000 10700 63039 2018 06 26

하지만 이 함수 외에도, 앞의 시계열 데이터의 날짜 분리를 활용할 수도 있고 이전 포스팅의 매핑함수를 적용할 수도 있다.

2-1. 매핑함수를 이용한 열분리(응용)

매핑함수와 for문을 활용해 위와 같은 결과를 도출해보자

df['연월일'] = df['연월일'].astype('str')
col = ['연','월','일']
for i in range(len(col)):
    df[col[i]] = df['연월일'].apply(lambda x : x.split('-')[i])

df.head()
연월일 당일종가 전일종가 시가 고가 저가 거래량
0 2018-07-02 10100 600 10850 10900 10000 137977 2018 07 02
1 2018-06-29 10700 300 10550 10900 9990 170253 2018 06 29
2 2018-06-28 10400 500 10900 10950 10150 155769 2018 06 28
3 2018-06-27 10900 100 10800 11050 10500 133548 2018 06 27
4 2018-06-26 10800 350 10900 11000 10700 63039 2018 06 26

그렇게 좋은 방법은 아닌 것 같다..
series객체.str.get()을 기억하자!!


Reference

도서 [파이썬 머신러닝 판다스 데이터 분석]을 공부하며 작성하였습니다.

댓글남기기