출처 : 금융 데이터 분석을 위한 파이썬 판다스
Merge : column 기준 병합
pd.merge(left=df1, right=df2, on=기준항목, how=방식)
### how 파라미터 기본 값 : inner(기준항목 교집합), left
from pandas import DataFrame import pandas as pd # 첫 번째 데이터프레임 data = [ ["전기전자", "005930", "삼성전자", 74400], ["화학", "051910", "LG화학", 896000], ["전기전자", "000660", "SK하이닉스", 101500] ] columns = ["업종", "종목코드", "종목명", "현재가"] df1 = DataFrame(data=data, columns=columns) print(df1) |
업종 종목코드 종목명 현재가 0 전기전자 005930 삼성전자 74400 1 화학 051910 LG화학 896000 2 전기전자 000660 SK하이닉스 101500 |
# 두 번째 데이터프레임 data = [ ["은행", 2.92], ["보험", 0.37], ["화학", 0.06], ["전기전자", -2.43] ] columns = ["업종", "등락률"] df2 = DataFrame(data=data, columns=columns) print(df2) |
업종 등락률 0 은행 2.92 1 보험 0.37 2 화학 0.06 3 전기전자 -2.43 |
df = pd.merge(left=df1, right=df2, on='업종') print(df) |
업종 종목코드 종목명 현재가 등락률 0 전기전자 005930 삼성전자 74400 -2.43 1 전기전자 000660 SK하이닉스 101500 -2.43 2 화학 051910 LG화학 896000 0.06 |
# 첫 번째 데이터프레임 data = [ ["전기전자", "005930", "삼성전자", 74400], ["화학", "051910", "LG화학", 896000], ["서비스업", "035720", "카카오", 121500] ] columns = ["업종", "종목코드", "종목명", "현재가"] df1 = DataFrame(data=data, columns=columns) print(df1) |
업종 종목코드 종목명 현재가 0 전기전자 005930 삼성전자 74400 1 화학 051910 LG화학 896000 2 서비스업 035720 카카오 121500 |
# 두 번째 데이터프레임 data = [ ["은행", 2.92], ["보험", 0.37], ["화학", 0.06], ["전기전자", -2.43] ] columns = ["업종", "등락률"] df2 = DataFrame(data=data, columns=columns) print(df2) |
업종 등락률 0 은행 2.92 1 보험 0.37 2 화학 0.06 3 전기전자 -2.43 |
df = pd.merge(left=df1, right=df2, how='left', on='업종') # how : 출력 기준 print(df) |
업종 종목코드 종목명 현재가 등락률 0 전기전자 005930 삼성전자 74400 -2.43 1 화학 051910 LG화학 896000 0.06 2 서비스업 035720 카카오 121500 NaN |
df = pd.merge(left=df1, right=df2, how='right', on='업종') # how : 출력 기준 print(df) |
업종 종목코드 종목명 현재가 등락률 0 은행 NaN NaN NaN 2.92 1 보험 NaN NaN NaN 0.37 2 화학 051910 LG화학 896000.0 0.06 3 전기전자 005930 삼성전자 74400.0 -2.43 |
df = pd.merge(left=df1, right=df2, how='inner', on='업종') print(df) |
업종 종목코드 종목명 현재가 등락률 0 전기전자 005930 삼성전자 74400 -2.43 1 화학 051910 LG화학 896000 0.06 |
df = pd.merge(left=df1, right=df2, how='outer', on='업종') print(df) |
업종 종목코드 종목명 현재가 등락률 0 전기전자 005930 삼성전자 74400.0 -2.43 1 화학 051910 LG화학 896000.0 0.06 2 서비스업 035720 카카오 121500.0 NaN 3 은행 NaN NaN NaN 2.92 4 보험 NaN NaN NaN 0.37 |
# 첫 번째 데이터프레임 data = [ ["전기전자", "005930", "삼성전자", 74400], ["화학", "051910", "LG화학", 896000], ["서비스업", "035720", "카카오", 121500] ] columns = ["업종", "종목코드", "종목명", "현재가"] df1 = DataFrame(data=data, columns=columns) print(df1) |
업종 종목코드 종목명 현재가 0 전기전자 005930 삼성전자 74400 1 화학 051910 LG화학 896000 2 서비스업 035720 카카오 121500 |
# 두 번째 데이터프레임 data = [ ["은행", 2.92], ["보험", 0.37], ["화학", 0.06], ["전기전자", -2.43] ] columns = ["항목", "등락률"] df2 = DataFrame(data=data, columns=columns) print(df2) |
항목 등락률 0 은행 2.92 1 보험 0.37 2 화학 0.06 3 전기전자 -2.43 |
df = pd.merge(left=df1, right=df2, left_on='업종', right_on='항목') print(df) |
업종 종목코드 종목명 현재가 항목 등락률 0 전기전자 005930 삼성전자 74400 전기전자 -2.43 1 화학 051910 LG화학 896000 화학 0.06 |
Join : index, column 기준 병합
df1.join(other=df2) - index 기준 병합
### how = left(기본)/right/outer(기본)/inner
df1.join(df2, on=항목) - index와column 기준 병합
# 첫 번째 데이터프레임 data = [ ["전기전자", "005930", "삼성전자", 74400], ["화학", "051910", "LG화학", 896000], ["서비스업", "035720", "카카오", 121500] ] columns = ["업종", "종목코드", "종목명", "현재가"] df1 = DataFrame(data=data, columns=columns) df1 = df1.set_index("업종") # column -> index : set_index() print(df1) |
종목코드 종목명 현재가 업종 전기전자 005930 삼성전자 74400 화학 051910 LG화학 896000 서비스업 035720 카카오 121500 |
# 두 번째 데이터프레임 data = [ ["은행", 2.92], ["보험", 0.37], ["화학", 0.06], ["전기전자", -2.43] ] columns = ["항목", "등락률"] df2 = DataFrame(data=data, columns=columns) df2 = df2.set_index("항목") print(df2) |
등락률 항목 은행 2.92 보험 0.37 화학 0.06 전기전자 -2.43 |
df_result = df1.join(other=df2) print(df_result) |
종목코드 종목명 현재가 등락률 업종 전기전자 005930 삼성전자 74400 -2.43 화학 051910 LG화학 896000 0.06 서비스업 035720 카카오 121500 NaN |
data = [ ["2017", "삼성", 500], ["2017", "LG", 300], ["2017", "SK하이닉스", 200], ["2018", "삼성", 600], ["2018", "LG", 400], ["2018", "SK하이닉스", 300], ] columns = ["연도", "회사", "시가총액"] df = DataFrame(data=data, columns=columns) print(df) |
연도 회사 시가총액 0 2017 삼성 500 1 2017 LG 300 2 2017 SK하이닉스 200 3 2018 삼성 600 4 2018 LG 400 5 2018 SK하이닉스 300 |
# Series -> DataFrame df_mean = df.groupby("연도")["시가총액"].mean().to_frame() df_mean.columns = ['시가총액평균'] print(df_mean) |
시가총액평균 연도 2017 333.333333 2018 433.333333 |
df = df.join(df_mean, on='연도') print(df) |
연도 회사 시가총액 시가총액평균 0 2017 삼성 500 333.333333 1 2017 LG 300 333.333333 2 2017 SK하이닉스 200 333.333333 3 2018 삼성 600 433.333333 4 2018 LG 400 433.333333 5 2018 SK하이닉스 300 433.333333 |
import numpy as np df['규모'] = np.where(df['시가총액'] >= df['시가총액평균'], "대형주", "중/소형주") print(df) |
연도 회사 시가총액 시가총액평균 규모 0 2017 삼성 500 333.333333 대형주 1 2017 LG 300 333.333333 중/소형주 2 2017 SK하이닉스 200 333.333333 중/소형주 3 2018 삼성 600 433.333333 대형주 4 2018 LG 400 433.333333 중/소형주 5 2018 SK하이닉스 300 433.333333 중/소형주 |
멀티인덱스
from pandas import DataFrame import pandas as pd data = [ ['영업이익', '컨센서스', 1000, 1200], ['영업이익', '잠정치', 900, 1400], ['당기순이익', '컨센서스', 800, 900], ['당기순이익', '잠정치', 700, 800], ] df = DataFrame(data=data) df = df.set_index( [ 0, 1 ] ) print(df) |
2 3 0 1 영업이익 컨센서스 1000 1200 잠정치 900 1400 당기순이익 컨센서스 800 900 잠정치 700 800 |
df.index.names = ["재무연월", ""] df.columns = ["2020/06", "2020/09"] print(df) |
2020/06 2020/09 재무연월 영업이익 컨센서스 1000 1200 잠정치 900 1400 당기순이익 컨센서스 800 900 잠정치 700 800 |
print(df.loc['영업이익']) | 2020/06 2020/09 컨센서스 1000 1200 잠정치 900 1400 |
print(df.loc[ ('영업이익', '컨센서스') ]) | 2020/06 1000 2020/09 1200 Name: (영업이익, 컨센서스), dtype: int64 |
print(df.iloc[0]) | 위와 동일 |
print(df.iloc[ 0, 0]) | 1000 |
print(df.loc[('영업이익', '컨센서스'), '2020/06']) | 위와 동일 |
a = [1, 2, 3, 4, 5] print(a[0:5:2]) print(a[slice(0, 5, 2)]) |
[1, 3, 5] [1, 3, 5] |
a = [1, 2, 3, 4, 5] b = [3, 4, 5, 6, 7] s = slice(0, 5, 2) print(a[ s ]) print(b[ s ]) |
[1, 3, 5] [3, 5, 7] |
a = [1, 2, 3, 4, 5] print(a[:]) print(a[slice(None)]) print(a[ : : ]) print(a[slice(None, None)]) |
동일 표현 [1, 2, 3, 4, 5] |
new_df = df.loc[ ( :, '컨센서스'), : ] print( df.loc[ ( :, '컨센서스'), : ] ) |
에러발생 |
new_df = df.loc[ (slice(None), '컨센서스'), :] print( df.loc[ ( :, '컨센서스'), : ] ) |
2020/06 2020/09 재무연월 영업이익 컨센서스 1000 1200 당기순이익 컨센서스 800 900 |
idx = pd.IndexSlice new_df = df.loc[ idx[ : , '컨센서스'], : ] print( df.loc[ ( :, '컨센서스'), : ] ) |
위와 동일 |
멀티컬럼
from pandas import DataFrame data = [ [1000, 900, 800, 700], [1200, 1400, 900, 800], ] columns = [ ['영업이익', '영업이익', '당기순이익', '당기순이익'], ['컨센서스', '잠정치', '컨센서스', '잠정치'] ] df = DataFrame(data=data, index=["2020/06", "2020/09"], columns=columns) print(df) |
영업이익 당기순이익 컨센서스 잠정치 컨센서스 잠정치 2020/06 1000 900 800 700 2020/09 1200 1400 900 800 |
import pandas as pd level_0 = ['영업이익', '당기순이익'] level_1 = ['컨센서스', '잠정치'] idx = pd.MultiIndex.from_product( [level_0, level_1],names=['재무연월',""] ) print(idx) print(idx.get_level_values(0)) columns = ['2020/06','2020/09'] data = [ [1000, 1200], [900, 1400], [800, 900], [700, 800] ] df =DataFrame(data,index=idx,columns =columns ) print(df) |
MultiIndex([( '영업이익', '컨센서스'), ( '영업이익', '잠정치'), ('당기순이익', '컨센서스'), ('당기순이익', '잠정치')], names=['재무연월', '']) Index(['영업이익', '영업이익', '당기순이익', '당기순이익'], dtype='object', name='재무연월') 2020/06 2020/09 재무연월 영업이익 컨센서스 1000 1200 잠정치 900 1400 당기순이익 컨센서스 800 900 잠정치 700 800 |
data = [ [1000, 1200], [900, 1400], [800, 900], [700, 800] ] t = [('영업이익', '컨센서스'), ('영업이익', '잠정치'), ('당기순이익', '컨센서스'), ('당기순이익', '잠정치') ] idx = pd.MultiIndex.from_tuples(t,names = ('재무연월',"")) columns = ['2020/06','2020/09'] df = DataFrame(data,index=idx, columns=columns) print(df) |
위와 동일 |
level_0 = ['영업이익', '당기순이익'] level_1 = ['컨센서스', '잠정치'] columns = pd.MultiIndex.from_product( [level_0, level_1] ) data = [ [1000, 900, 800, 700], [1200, 1400, 900, 800], ] df = DataFrame(data=data, index=["2020/06", "2020/09"], columns=columns) print(df) |
재무연월 영업이익 당기순이익 컨센서스 잠정치 컨센서스 잠정치 2020/06 1000 900 800 700 2020/09 1200 1400 900 800 |
print(df['영업이익']) | 컨센서스 잠정치 2020/06 1000 900 2020/09 1200 1400 |
print(df[ ('영업이익', '컨센서스') ]) | 2020/06 1000 2020/09 1200 Name: (영업이익, 컨센서스), dtype: int64 |
print(df[ '영업이익' ]) print(df.loc[ '2020/06', '영업이익' ]) print(df.loc[ '2020/06', ( '영업이익', '컨센서스' ) ]) print(df.loc[ '2020/06', ( slice(None), '컨센서스' ) ]) |
컨센서스 잠정치 2020/06 1000 900 2020/09 1200 1400 컨센서스 1000 잠정치 900 Name: 2020/06, dtype: int64 1000 영업이익 컨센서스 1000 당기순이익 컨센서스 800 Name: 2020/06, dtype: int64 |
print(df.transpose()) print(df.T) |
2020/06 2020/09 재무연월 영업이익 컨센서스 1000 1200 잠정치 900 1400 당기순이익 컨센서스 800 900 잠정치 700 800 |
Stack ( c->i ) / Unstack ( i->c )
stack() : 낮은 레벨의 컬럼을 인덱스로 변환
from pandas import DataFrame data = [ [1000, 900, 800, 700], [1200, 1400, 900, 800] ] columns = [ ['영업이익', '영업이익', '당기순이익', '당기순이익'], ['컨센서스', '잠정치', '컨센서스', '잠정치'] ] index = ["2020/06", "2020/09"] df = DataFrame(data=data, index=index, columns=columns) print(df) |
재무연월 영업이익 당기순이익 컨센서스 잠정치 컨센서스 잠정치 2020/06 1000 900 800 700 2020/09 1200 1400 900 800 |
new_df = df.stack() # 낮은 레벨 부터 stack print(new_df) |
당기순이익 영업이익 2020/06 잠정치 700 900 컨센서스 800 1000 2020/09 잠정치 800 1400 컨센서스 900 1200 |
new_df = df.stack(level=0) print(new_df) |
잠정치 컨센서스 2020/06 당기순이익 700 800 영업이익 900 1000 2020/09 당기순이익 800 900 영업이익 1400 1200 |
new_df = df.stack().stack() print(new_df) |
2020/06 잠정치 당기순이익 700 영업이익 900 컨센서스 당기순이익 800 영업이익 1000 2020/09 잠정치 당기순이익 800 영업이익 1400 컨센서스 당기순이익 900 영업이익 1200 dtype: int64 |
new_df = df.stack().unstack() print(new_df) |
재무연월 영업이익 당기순이익 컨센서스 잠정치 컨센서스 잠정치 2020/06 1000 900 800 700 2020/09 1200 1400 900 800 |
data = [ [1000, 1100, 900, 1200, 1300], [800, 2000, 1700, 1500, 1800] ] index = ['자본금', '부채'] columns = ["2020/03", "2020/06", "2020/09", "2021/03", "2021/06"] df = DataFrame(data, index, columns) print(df) |
2020/03 2020/06 2020/09 2021/03 2021/06 자본금 1000 1100 900 1200 1300 부채 800 2000 1700 1500 1800 |
df_stacked = df.stack().reset_index() print(df_stacked) |
level_0 level_1 0 0 자본금 2020/03 1000 1 자본금 2020/06 1100 2 자본금 2020/09 900 3 자본금 2021/03 1200 4 자본금 2021/06 1300 5 부채 2020/03 800 6 부채 2020/06 2000 7 부채 2020/09 1700 8 부채 2021/03 1500 9 부채 2021/06 1800 |
result_df = df_stacked['level_1'].str.split('/') print(result_df) |
0 [2020, 03] 1 [2020, 06] 2 [2020, 09] 3 [2021, 03] 4 [2021, 06] 5 [2020, 03] 6 [2020, 06] 7 [2020, 09] 8 [2021, 03] 9 [2021, 06] Name: level_1, dtype: object |
df_split = DataFrame( list(df_stacked['level_1'].str.split('/'))) print(df_split) |
0 1 0 2020 03 1 2020 06 2 2020 09 3 2021 03 4 2021 06 5 2020 03 6 2020 06 7 2020 09 8 2021 03 9 2021 06 |
import pandas as pd df_merged = pd.concat( [df_stacked, df_split], axis=1 ) df_merged.columns = ['계정', "년월", "금액", "연도", "월"] print(df_merged) |
계정 년월 금액 연도 월 0 자본금 2020/03 1000 2020 03 1 자본금 2020/06 1100 2020 06 2 자본금 2020/09 900 2020 09 3 자본금 2021/03 1200 2021 03 4 자본금 2021/06 1300 2021 06 5 부채 2020/03 800 2020 03 6 부채 2020/06 2000 2020 06 7 부채 2020/09 1700 2020 09 8 부채 2021/03 1500 2021 03 9 부채 2021/06 1800 2021 06 |
df_group = df_merged.groupby(["계정", "연도"]).sum() print(df_group) |
금액 계정 연도 부채 2020 4500 2021 3300 자본금 2020 3000 2021 2500 |
df_unstack = df_group.unstack() print(df_unstack) |
금액 연도 2020 2021 계정 부채 4500 3300 자본금 3000 2500 |
result = df_unstack['금액'] result.columns.name = '' result.index.name = '' print(result) |
부채 4500 3300 자본금 3000 2500 |
pivot
df_result = pd.pivot(data=df, index=항목, columns=항목, values=항목)
from pandas import DataFrame import pandas as pd data = [ ["2021-08-12", "삼성전자", 77000], ["2021-08-13", "삼성전자", 74400], ["2021-08-12", "LG전자", 153000], ["2021-08-13", "LG전자", 150500], ["2021-08-12", "SK하이닉스", 100500], ["2021-08-13", "SK하이닉스", 101500] ] columns = ["날짜", "종목명", "종가"] df = DataFrame(data=data, columns=columns) print(df) |
날짜 종목명 종가 0 2021-08-12 삼성전자 77000 1 2021-08-13 삼성전자 74400 2 2021-08-12 LG전자 153000 3 2021-08-13 LG전자 150500 4 2021-08-12 SK하이닉스 100500 5 2021-08-13 SK하이닉스 101500 |
df1=pd.pivot(data=df, index="날짜", columns="종목명", values="종가") print(df1) |
종목명 LG전자 SK하이닉스 삼성전자 날짜 2021-08-12 153000 100500 77000 2021-08-13 150500 101500 74400 |
df_result = df.groupby(["날짜", "종목명"]).mean().unstack() print(df_result) |
종가 종목명 LG전자 SK하이닉스 삼성전자 날짜 2021-08-12 153000.0 100500.0 77000.0 2021-08-13 150500.0 101500.0 74400.0 |
df_result =pd.pivot(data=df, index="종목명", columns="날짜", values="종가") print(df_result) |
날짜 2021-08-12 2021-08-13 종목명 LG전자 153000 150500 SK하이닉스 100500 101500 삼성전자 77000 74400 |
Melt
df.melt()
df.melt(id_vars=[고정할 항목]) # 고정 칼럼 지정
df.melt(value_vars=[슬라이싱할 항목]) # 컬럼을 슬라이싱후 melt
from pandas import DataFrame data = [ ["005930", "삼성전자", 75800, 76000, 74100, 74400], ["035720", "카카오", 147500, 147500, 144500, 146000], ["000660", "SK하이닉스", 99600, 101500, 98900, 101500] ] columns = ["종목코드", "종목명", "시가", "고가", "저가", "종가"] df = DataFrame(data=data, columns=columns) print(df) |
종목코드 종목명 시가 고가 저가 종가 0 005930 삼성전자 75800 76000 74100 74400 1 035720 카카오 147500 47500 144500 146000 2 000660SK하이닉스 99600 01500 98900 101500 |
df_result = df.melt() print(df_result) |
variable value 0 종목코드 005930 1 종목코드 035720 2 종목코드 000660 3 종목명 삼성전자 4 종목명 카카오 5 종목명 SK하이닉스 6 시가 75800 7 시가 147500 8 시가 99600 9 고가 76000 10 고가 147500 11 고가 101500 12 저가 74100 13 저가 144500 14 저가 98900 15 종가 74400 16 종가 146000 17 종가 101500 |
# 고정 칼럼 지정 df_result = df.melt(id_vars=['종목코드', '종목명']) print(df_result) |
종목코드 종목명 variable value 0 005930 삼성전자 시가 75800 1 035720 카카오 시가 147500 2 000660 SK하이닉스 시가 99600 3 005930 삼성전자 고가 76000 4 035720 카카오 고가 147500 5 000660 SK하이닉스 고가 101500 6 005930 삼성전자 저가 74100 7 035720 카카오 저가 144500 8 000660 SK하이닉스 저가 98900 9 005930 삼성전자 종가 74400 10 035720 카카오 종가 146000 11 000660 SK하이닉스 종가 101500 |
# 컬럼을 슬라이싱후 melt df_result = df.melt(value_vars=['시가', '종가']) print(df_result) |
variable value 0 시가 75800 1 시가 147500 2 시가 99600 3 종가 74400 4 종가 146000 5 종가 101500 |
'DataFrame' 카테고리의 다른 글
TimeStamp (0) | 2022.04.09 |
---|---|
판다스 데이터프레임 (데이터 읽기/ 저장하기) (0) | 2022.04.07 |
판다스 데이터프레임 (고급기능1) (0) | 2022.04.07 |
판다스 데이터프레임 (0) | 2022.04.07 |
Series (0) | 2022.04.07 |
댓글