본문 바로가기
DataFrame

판다스 데이터프레임 (고급기능2)

by 자동매매 2022. 4. 7.

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

댓글