공부 기록
Pandas(0728_day4) - 실습_데이터 합치기 본문
- 데이터 프레임 연결(concatenate)
In [1]:
import pandas as pd
In [2]:
df1 = pd.DataFrame({'a': ['a0', 'a1', 'a2', 'a3'],
'b': ['b0', 'b1', 'b2', 'b3'],
'c': ['c0', 'c1', 'c2', 'c3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'a': ['a2', 'a3', 'a4', 'a5'],
'b': ['b2', 'b3', 'b4', 'b5'],
'c': ['c2', 'c3', 'c4', 'c5'],
'd': ['d2', 'd3', 'd4', 'd5']},
index=[2, 3, 4, 5])
In [3]:
df1
Out[3]:
a | b | c | |
---|---|---|---|
0 | a0 | b0 | c0 |
1 | a1 | b1 | c1 |
2 | a2 | b2 | c2 |
3 | a3 | b3 | c3 |
In [4]:
df2
Out[4]:
a | b | c | d | |
---|---|---|---|---|
2 | a2 | b2 | c2 | d2 |
3 | a3 | b3 | c3 | d3 |
4 | a4 | b4 | c4 | d4 |
5 | a5 | b5 | c5 | d5 |
In [5]:
# 2개의 데이터프레임을 위 아래 행 방향으로 이어 붙이듯 연결하기
pd.concat([df1, df2])
Out[5]:
a | b | c | d | |
---|---|---|---|---|
0 | a0 | b0 | c0 | NaN |
1 | a1 | b1 | c1 | NaN |
2 | a2 | b2 | c2 | NaN |
3 | a3 | b3 | c3 | NaN |
2 | a2 | b2 | c2 | d2 |
3 | a3 | b3 | c3 | d3 |
4 | a4 | b4 | c4 | d4 |
5 | a5 | b5 | c5 | d5 |
In [7]:
# ignore_index=True 옵션 설정하기
pd.concat([df1, df2], ignore_index=True)
Out[7]:
a | b | c | d | |
---|---|---|---|---|
0 | a0 | b0 | c0 | NaN |
1 | a1 | b1 | c1 | NaN |
2 | a2 | b2 | c2 | NaN |
3 | a3 | b3 | c3 | NaN |
4 | a2 | b2 | c2 | d2 |
5 | a3 | b3 | c3 | d3 |
6 | a4 | b4 | c4 | d4 |
7 | a5 | b5 | c5 | d5 |
In [8]:
# 2개의 데이터프레임을 좌우 열 방향으로 이어 붙이듯 연결하기
pd.concat([df1, df2], axis=1)
Out[8]:
a | b | c | a | b | c | d | |
---|---|---|---|---|---|---|---|
0 | a0 | b0 | c0 | NaN | NaN | NaN | NaN |
1 | a1 | b1 | c1 | NaN | NaN | NaN | NaN |
2 | a2 | b2 | c2 | a2 | b2 | c2 | d2 |
3 | a3 | b3 | c3 | a3 | b3 | c3 | d3 |
4 | NaN | NaN | NaN | a4 | b4 | c4 | d4 |
5 | NaN | NaN | NaN | a5 | b5 | c5 | d5 |
In [11]:
# 두 데이터프레임에 모두 있는 행만 추출 (교집합)
pd.concat([df1, df2], axis=1, join='inner')
Out[11]:
a | b | c | a | b | c | d | |
---|---|---|---|---|---|---|---|
2 | a2 | b2 | c2 | a2 | b2 | c2 | d2 |
3 | a3 | b3 | c3 | a3 | b3 | c3 | d3 |
In [12]:
# 시리즈 만들기
sr1 = pd.Series(['e0', 'e1', 'e2', 'e3'], name='e')
sr2 = pd.Series(['f0', 'f1', 'f2'], name='f', index=[3, 4, 5])
sr3 = pd.Series(['g0', 'g1', 'g2', 'g3'], name='g')
In [13]:
sr1
Out[13]:
0 e0
1 e1
2 e2
3 e3
Name: e, dtype: object
In [14]:
sr2
Out[14]:
3 f0
4 f1
5 f2
Name: f, dtype: object
In [15]:
sr3
Out[15]:
0 g0
1 g1
2 g2
3 g3
Name: g, dtype: object
In [16]:
df1
Out[16]:
a | b | c | |
---|---|---|---|
0 | a0 | b0 | c0 |
1 | a1 | b1 | c1 |
2 | a2 | b2 | c2 |
3 | a3 | b3 | c3 |
In [17]:
# df1과 sr1을 좌우 열 방향으로 연결하기
pd.concat([df1, sr1], axis=1)
Out[17]:
a | b | c | e | |
---|---|---|---|---|
0 | a0 | b0 | c0 | e0 |
1 | a1 | b1 | c1 | e1 |
2 | a2 | b2 | c2 | e2 |
3 | a3 | b3 | c3 | e3 |
In [18]:
# df2과 sr2을 좌우 열 방향으로 연결하기(정렬)
pd.concat([df2, sr2], axis=1, sort=True)
Out[18]:
a | b | c | d | f | |
---|---|---|---|---|---|
2 | a2 | b2 | c2 | d2 | NaN |
3 | a3 | b3 | c3 | d3 | f0 |
4 | a4 | b4 | c4 | d4 | f1 |
5 | a5 | b5 | c5 | d5 | f2 |
In [19]:
# sr1과 sr3을 좌우 열 방향으로 연결하기
pd.concat([sr1, sr3], axis=1)
Out[19]:
e | g | |
---|---|---|
0 | e0 | g0 |
1 | e1 | g1 |
2 | e2 | g2 |
3 | e3 | g3 |
In [20]:
# sr1과 sr3을 위 아래 행 방향으로 이어 붙이듯 연결하기
pd.concat([sr1, sr3])
Out[20]:
0 e0
1 e1
2 e2
3 e3
0 g0
1 g1
2 g2
3 g3
dtype: object
- 데이터 프레임 합치기 (merge)
In [69]:
import pandas as pd
# 주식 데이터를 가져와서 데이터프레임 만들기
df1 = pd.read_excel('stock price.xlsx')
df2 = pd.read_excel('stock valuation.xlsx')
In [70]:
df1
Out[70]:
id | stock_name | value | price | |
---|---|---|---|---|
0 | 128940 | 한미약품 | 59385.666667 | 421000 |
1 | 130960 | CJ E&M | 58540.666667 | 98900 |
2 | 138250 | 엔에스쇼핑 | 14558.666667 | 13200 |
3 | 139480 | 이마트 | 239230.833333 | 254500 |
4 | 142280 | 녹십자엠에스 | 468.833333 | 10200 |
5 | 145990 | 삼양사 | 82750.000000 | 82000 |
6 | 185750 | 종근당 | 40293.666667 | 100500 |
7 | 192400 | 쿠쿠홀딩스 | 179204.666667 | 177500 |
8 | 199800 | 툴젠 | -2514.333333 | 115400 |
9 | 204210 | 모두투어리츠 | 3093.333333 | 3475 |
In [71]:
df2
Out[71]:
id | name | eps | bps | per | pbr | |
---|---|---|---|---|---|---|
0 | 130960 | CJ E&M | 6301.333333 | 54068 | 15.695091 | 1.829178 |
1 | 136480 | 하림 | 274.166667 | 3551 | 11.489362 | 0.887074 |
2 | 138040 | 메리츠금융지주 | 2122.333333 | 14894 | 6.313806 | 0.899691 |
3 | 139480 | 이마트 | 18268.166667 | 295780 | 13.931338 | 0.860437 |
4 | 145990 | 삼양사 | 5741.000000 | 108090 | 14.283226 | 0.758627 |
5 | 161390 | 한국타이어 | 5648.500000 | 51341 | 7.453306 | 0.820007 |
6 | 181710 | NHN엔터테인먼트 | 2110.166667 | 78434 | 30.755864 | 0.827447 |
7 | 185750 | 종근당 | 3990.333333 | 40684 | 25.185866 | 2.470259 |
8 | 204210 | 모두투어리츠 | 85.166667 | 5335 | 40.802348 | 0.651359 |
9 | 207940 | 삼성바이오로직스 | 4644.166667 | 60099 | 89.790059 | 6.938551 |
In [72]:
# 데이터프레임 합치기 - 교집합
pd.merge(df1, df2)
Out[72]:
id | stock_name | value | price | name | eps | bps | per | pbr | |
---|---|---|---|---|---|---|---|---|---|
0 | 130960 | CJ E&M | 58540.666667 | 98900 | CJ E&M | 6301.333333 | 54068 | 15.695091 | 1.829178 |
1 | 139480 | 이마트 | 239230.833333 | 254500 | 이마트 | 18268.166667 | 295780 | 13.931338 | 0.860437 |
2 | 145990 | 삼양사 | 82750.000000 | 82000 | 삼양사 | 5741.000000 | 108090 | 14.283226 | 0.758627 |
3 | 185750 | 종근당 | 40293.666667 | 100500 | 종근당 | 3990.333333 | 40684 | 25.185866 | 2.470259 |
4 | 204210 | 모두투어리츠 | 3093.333333 | 3475 | 모두투어리츠 | 85.166667 | 5335 | 40.802348 | 0.651359 |
In [73]:
# 데이터프레임 합치기 - 합집합
pd.merge(df1, df2, how='outer')
Out[73]:
id | stock_name | value | price | name | eps | bps | per | pbr | |
---|---|---|---|---|---|---|---|---|---|
0 | 128940 | 한미약품 | 59385.666667 | 421000.0 | NaN | NaN | NaN | NaN | NaN |
1 | 130960 | CJ E&M | 58540.666667 | 98900.0 | CJ E&M | 6301.333333 | 54068.0 | 15.695091 | 1.829178 |
2 | 138250 | 엔에스쇼핑 | 14558.666667 | 13200.0 | NaN | NaN | NaN | NaN | NaN |
3 | 139480 | 이마트 | 239230.833333 | 254500.0 | 이마트 | 18268.166667 | 295780.0 | 13.931338 | 0.860437 |
4 | 142280 | 녹십자엠에스 | 468.833333 | 10200.0 | NaN | NaN | NaN | NaN | NaN |
5 | 145990 | 삼양사 | 82750.000000 | 82000.0 | 삼양사 | 5741.000000 | 108090.0 | 14.283226 | 0.758627 |
6 | 185750 | 종근당 | 40293.666667 | 100500.0 | 종근당 | 3990.333333 | 40684.0 | 25.185866 | 2.470259 |
7 | 192400 | 쿠쿠홀딩스 | 179204.666667 | 177500.0 | NaN | NaN | NaN | NaN | NaN |
8 | 199800 | 툴젠 | -2514.333333 | 115400.0 | NaN | NaN | NaN | NaN | NaN |
9 | 204210 | 모두투어리츠 | 3093.333333 | 3475.0 | 모두투어리츠 | 85.166667 | 5335.0 | 40.802348 | 0.651359 |
10 | 136480 | NaN | NaN | NaN | 하림 | 274.166667 | 3551.0 | 11.489362 | 0.887074 |
11 | 138040 | NaN | NaN | NaN | 메리츠금융지주 | 2122.333333 | 14894.0 | 6.313806 | 0.899691 |
12 | 161390 | NaN | NaN | NaN | 한국타이어 | 5648.500000 | 51341.0 | 7.453306 | 0.820007 |
13 | 181710 | NaN | NaN | NaN | NHN엔터테인먼트 | 2110.166667 | 78434.0 | 30.755864 | 0.827447 |
14 | 207940 | NaN | NaN | NaN | 삼성바이오로직스 | 4644.166667 | 60099.0 | 89.790059 | 6.938551 |
In [74]:
# 데이터프레임 합치기 - 왼쪽 데이터프레임 기준, df1에서는 'stock_name', df2에서는 'name' 기준으로 합치기
pd.merge(df1, df2, how='left', left_on='stock_name', right_on='name')
Out[74]:
id_x | stock_name | value | price | id_y | name | eps | bps | per | pbr | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 128940 | 한미약품 | 59385.666667 | 421000 | NaN | NaN | NaN | NaN | NaN | NaN |
1 | 130960 | CJ E&M | 58540.666667 | 98900 | 130960.0 | CJ E&M | 6301.333333 | 54068.0 | 15.695091 | 1.829178 |
2 | 138250 | 엔에스쇼핑 | 14558.666667 | 13200 | NaN | NaN | NaN | NaN | NaN | NaN |
3 | 139480 | 이마트 | 239230.833333 | 254500 | 139480.0 | 이마트 | 18268.166667 | 295780.0 | 13.931338 | 0.860437 |
4 | 142280 | 녹십자엠에스 | 468.833333 | 10200 | NaN | NaN | NaN | NaN | NaN | NaN |
5 | 145990 | 삼양사 | 82750.000000 | 82000 | 145990.0 | 삼양사 | 5741.000000 | 108090.0 | 14.283226 | 0.758627 |
6 | 185750 | 종근당 | 40293.666667 | 100500 | 185750.0 | 종근당 | 3990.333333 | 40684.0 | 25.185866 | 2.470259 |
7 | 192400 | 쿠쿠홀딩스 | 179204.666667 | 177500 | NaN | NaN | NaN | NaN | NaN | NaN |
8 | 199800 | 툴젠 | -2514.333333 | 115400 | NaN | NaN | NaN | NaN | NaN | NaN |
9 | 204210 | 모두투어리츠 | 3093.333333 | 3475 | 204210.0 | 모두투어리츠 | 85.166667 | 5335.0 | 40.802348 | 0.651359 |
In [84]:
# 데이터프레임 합치기 - 오른쪽 데이터프레임 기준, df1에서는 'stock_name', df2에서는 'name' 기준으로 합치기
pd.merge(df1, df2, left_on = 'stock_name', right_on = 'name', how='right')
Out[84]:
id_x | stock_name | value | price | id_y | name | eps | bps | per | pbr | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 130960.0 | CJ E&M | 58540.666667 | 98900.0 | 130960 | CJ E&M | 6301.333333 | 54068 | 15.695091 | 1.829178 |
1 | NaN | NaN | NaN | NaN | 136480 | 하림 | 274.166667 | 3551 | 11.489362 | 0.887074 |
2 | NaN | NaN | NaN | NaN | 138040 | 메리츠금융지주 | 2122.333333 | 14894 | 6.313806 | 0.899691 |
3 | 139480.0 | 이마트 | 239230.833333 | 254500.0 | 139480 | 이마트 | 18268.166667 | 295780 | 13.931338 | 0.860437 |
4 | 145990.0 | 삼양사 | 82750.000000 | 82000.0 | 145990 | 삼양사 | 5741.000000 | 108090 | 14.283226 | 0.758627 |
5 | NaN | NaN | NaN | NaN | 161390 | 한국타이어 | 5648.500000 | 51341 | 7.453306 | 0.820007 |
6 | NaN | NaN | NaN | NaN | 181710 | NHN엔터테인먼트 | 2110.166667 | 78434 | 30.755864 | 0.827447 |
7 | 185750.0 | 종근당 | 40293.666667 | 100500.0 | 185750 | 종근당 | 3990.333333 | 40684 | 25.185866 | 2.470259 |
8 | 204210.0 | 모두투어리츠 | 3093.333333 | 3475.0 | 204210 | 모두투어리츠 | 85.166667 | 5335 | 40.802348 | 0.651359 |
9 | NaN | NaN | NaN | NaN | 207940 | 삼성바이오로직스 | 4644.166667 | 60099 | 89.790059 | 6.938551 |
- 데이터 프레임 결합
In [85]:
# 주식 데이터를 가져와서 데이터프레임 만들기
df1 = pd.read_excel('stock price.xlsx', index_col='id')
df2 = pd.read_excel('stock valuation.xlsx', index_col='id')
In [86]:
df1
Out[86]:
stock_name | value | price | |
---|---|---|---|
id | |||
128940 | 한미약품 | 59385.666667 | 421000 |
130960 | CJ E&M | 58540.666667 | 98900 |
138250 | 엔에스쇼핑 | 14558.666667 | 13200 |
139480 | 이마트 | 239230.833333 | 254500 |
142280 | 녹십자엠에스 | 468.833333 | 10200 |
145990 | 삼양사 | 82750.000000 | 82000 |
185750 | 종근당 | 40293.666667 | 100500 |
192400 | 쿠쿠홀딩스 | 179204.666667 | 177500 |
199800 | 툴젠 | -2514.333333 | 115400 |
204210 | 모두투어리츠 | 3093.333333 | 3475 |
In [87]:
df2
Out[87]:
name | eps | bps | per | pbr | |
---|---|---|---|---|---|
id | |||||
130960 | CJ E&M | 6301.333333 | 54068 | 15.695091 | 1.829178 |
136480 | 하림 | 274.166667 | 3551 | 11.489362 | 0.887074 |
138040 | 메리츠금융지주 | 2122.333333 | 14894 | 6.313806 | 0.899691 |
139480 | 이마트 | 18268.166667 | 295780 | 13.931338 | 0.860437 |
145990 | 삼양사 | 5741.000000 | 108090 | 14.283226 | 0.758627 |
161390 | 한국타이어 | 5648.500000 | 51341 | 7.453306 | 0.820007 |
181710 | NHN엔터테인먼트 | 2110.166667 | 78434 | 30.755864 | 0.827447 |
185750 | 종근당 | 3990.333333 | 40684 | 25.185866 | 2.470259 |
204210 | 모두투어리츠 | 85.166667 | 5335 | 40.802348 | 0.651359 |
207940 | 삼성바이오로직스 | 4644.166667 | 60099 | 89.790059 | 6.938551 |
In [88]:
# 데이터프레임 인덱스를 기준으로 결합 (왼쪽 데이터 프레임 기준)
pd.merge(df1, df2, how='left', left_index=True, right_index=True)
Out[88]:
stock_name | value | price | name | eps | bps | per | pbr | |
---|---|---|---|---|---|---|---|---|
id | ||||||||
128940 | 한미약품 | 59385.666667 | 421000 | NaN | NaN | NaN | NaN | NaN |
130960 | CJ E&M | 58540.666667 | 98900 | CJ E&M | 6301.333333 | 54068.0 | 15.695091 | 1.829178 |
138250 | 엔에스쇼핑 | 14558.666667 | 13200 | NaN | NaN | NaN | NaN | NaN |
139480 | 이마트 | 239230.833333 | 254500 | 이마트 | 18268.166667 | 295780.0 | 13.931338 | 0.860437 |
142280 | 녹십자엠에스 | 468.833333 | 10200 | NaN | NaN | NaN | NaN | NaN |
145990 | 삼양사 | 82750.000000 | 82000 | 삼양사 | 5741.000000 | 108090.0 | 14.283226 | 0.758627 |
185750 | 종근당 | 40293.666667 | 100500 | 종근당 | 3990.333333 | 40684.0 | 25.185866 | 2.470259 |
192400 | 쿠쿠홀딩스 | 179204.666667 | 177500 | NaN | NaN | NaN | NaN | NaN |
199800 | 툴젠 | -2514.333333 | 115400 | NaN | NaN | NaN | NaN | NaN |
204210 | 모두투어리츠 | 3093.333333 | 3475 | 모두투어리츠 | 85.166667 | 5335.0 | 40.802348 | 0.651359 |
In [89]:
df1.join(df2)
Out[89]:
stock_name | value | price | name | eps | bps | per | pbr | |
---|---|---|---|---|---|---|---|---|
id | ||||||||
128940 | 한미약품 | 59385.666667 | 421000 | NaN | NaN | NaN | NaN | NaN |
130960 | CJ E&M | 58540.666667 | 98900 | CJ E&M | 6301.333333 | 54068.0 | 15.695091 | 1.829178 |
138250 | 엔에스쇼핑 | 14558.666667 | 13200 | NaN | NaN | NaN | NaN | NaN |
139480 | 이마트 | 239230.833333 | 254500 | 이마트 | 18268.166667 | 295780.0 | 13.931338 | 0.860437 |
142280 | 녹십자엠에스 | 468.833333 | 10200 | NaN | NaN | NaN | NaN | NaN |
145990 | 삼양사 | 82750.000000 | 82000 | 삼양사 | 5741.000000 | 108090.0 | 14.283226 | 0.758627 |
185750 | 종근당 | 40293.666667 | 100500 | 종근당 | 3990.333333 | 40684.0 | 25.185866 | 2.470259 |
192400 | 쿠쿠홀딩스 | 179204.666667 | 177500 | NaN | NaN | NaN | NaN | NaN |
199800 | 툴젠 | -2514.333333 | 115400 | NaN | NaN | NaN | NaN | NaN |
204210 | 모두투어리츠 | 3093.333333 | 3475 | 모두투어리츠 | 85.166667 | 5335.0 | 40.802348 | 0.651359 |
In [90]:
# 데이터프레임 인덱스를 기준으로 결합 (교집합)
pd.merge(df1, df2, how='inner', left_index=True, right_index=True)
Out[90]:
stock_name | value | price | name | eps | bps | per | pbr | |
---|---|---|---|---|---|---|---|---|
id | ||||||||
130960 | CJ E&M | 58540.666667 | 98900 | CJ E&M | 6301.333333 | 54068 | 15.695091 | 1.829178 |
139480 | 이마트 | 239230.833333 | 254500 | 이마트 | 18268.166667 | 295780 | 13.931338 | 0.860437 |
145990 | 삼양사 | 82750.000000 | 82000 | 삼양사 | 5741.000000 | 108090 | 14.283226 | 0.758627 |
185750 | 종근당 | 40293.666667 | 100500 | 종근당 | 3990.333333 | 40684 | 25.185866 | 2.470259 |
204210 | 모두투어리츠 | 3093.333333 | 3475 | 모두투어리츠 | 85.166667 | 5335 | 40.802348 | 0.651359 |
In [91]:
df1.join(df2, how='inner')
Out[91]:
stock_name | value | price | name | eps | bps | per | pbr | |
---|---|---|---|---|---|---|---|---|
id | ||||||||
130960 | CJ E&M | 58540.666667 | 98900 | CJ E&M | 6301.333333 | 54068 | 15.695091 | 1.829178 |
139480 | 이마트 | 239230.833333 | 254500 | 이마트 | 18268.166667 | 295780 | 13.931338 | 0.860437 |
145990 | 삼양사 | 82750.000000 | 82000 | 삼양사 | 5741.000000 | 108090 | 14.283226 | 0.758627 |
185750 | 종근당 | 40293.666667 | 100500 | 종근당 | 3990.333333 | 40684 | 25.185866 | 2.470259 |
204210 | 모두투어리츠 | 3093.333333 | 3475 | 모두투어리츠 | 85.166667 | 5335 | 40.802348 | 0.651359 |
In [ ]:
'playdata' 카테고리의 다른 글
ML(0804_day1) - 실습_붓꽃 데이터 품종 예측하기 (0) | 2021.08.04 |
---|---|
Pandas(0728_day4) - 실습_타이타닉 데이터셋 (0) | 2021.07.28 |
Pandas(0728_day4) - 실습_자동차 연비 분석 (데이터 전처리 및 시각화) (0) | 2021.07.28 |
Pandas(0728_day4) (0) | 2021.07.28 |
Pandas(0727_day3) (0) | 2021.07.27 |
Comments