[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
도서 [파이썬 머신러닝 판다스 데이터 분석]을 공부하며 작성하였습니다.
댓글남기기