데이터 통합하기¶
- cocat: 단순 병합
- concat을 하면 디폴트로 axis = 0을 기준으로 병합한다. (위아래)
- 만약 column이나 index의 개수가 맞지 않으면 빈 값은 NaN으로 처리된다.
- ignore_index = True: 인덱스 번호를 합쳐진 데이터프레임을 기준으로 다시 생성
- 통합할 때 같은 이름의 index, column을 기준으로 통합한다.
In [9]:
import pandas as pd
import numpy as np
num_df1 = pd.DataFrame({
'Class1' : [1, 2, 3, 4],
'Class2' : [5, 6, 7, 8]
})
str_df = pd.DataFrame({
'Class1' : ['John', 'Doe'],
'Class2' : ['Cat', 'Dog']
})
print(num_df1)
print(str_df)
Class1 Class2
0 1 5
1 2 6
2 3 7
3 4 8
Class1 Class2
0 John Cat
1 Doe Dog
In [10]:
#concat
result = pd.concat([num_df1, str_df]) #axis = 0
result
Out[10]:
Class1 | Class2 | |
---|---|---|
0 | 1 | 5 |
1 | 2 | 6 |
2 | 3 | 7 |
3 | 4 | 8 |
0 | John | Cat |
1 | Doe | Dog |
In [11]:
#column의 개수가 맞지 않는 axis = 0 concat
#없는 공간은 NaN으로 처리된다.
num_df2 = pd.DataFrame({
'Class1' : [9, 10]
})
pd.concat([result, num_df2])
Out[11]:
Class1 | Class2 | |
---|---|---|
0 | 1 | 5 |
1 | 2 | 6 |
2 | 3 | 7 |
3 | 4 | 8 |
0 | John | Cat |
1 | Doe | Dog |
0 | 9 | NaN |
1 | 10 | NaN |
In [12]:
pd.concat([result, num_df2], ignore_index = True)
Out[12]:
Class1 | Class2 | |
---|---|---|
0 | 1 | 5 |
1 | 2 | 6 |
2 | 3 | 7 |
3 | 4 | 8 |
4 | John | Cat |
5 | Doe | Dog |
6 | 9 | NaN |
7 | 10 | NaN |
In [14]:
#pd.concat([num_df1, str_df], axis = 1) #axis = 1. index가 합쳐짐
Out[14]:
Class1 | Class2 | Class1 | Class2 | |
---|---|---|---|---|
0 | 1 | 5 | John | Cat |
1 | 2 | 6 | Doe | Dog |
2 | 3 | 7 | NaN | NaN |
3 | 4 | 8 | NaN | NaN |
In [19]:
#column의 이름을 기준으로 통합한다.
num_df1_1 = pd.DataFrame({
'Class1' : [1, 2, 3, 4],
'Class2' : [5, 6, 7, 8]
})
str_df_1 = pd.DataFrame({
'Class3' : ['John', 'Doe'],
'Class4' : ['Cat', 'Dog']
})
result_diff = pd.concat([num_df1_1, str_df_1]) #axis = 0
result_diff
Out[19]:
Class1 | Class2 | Class3 | Class4 | |
---|---|---|---|---|
0 | 1.0 | 5.0 | NaN | NaN |
1 | 2.0 | 6.0 | NaN | NaN |
2 | 3.0 | 7.0 | NaN | NaN |
3 | 4.0 | 8.0 | NaN | NaN |
0 | NaN | NaN | John | Cat |
1 | NaN | NaN | Doe | Dog |
- join
- 행(index)를 기준으로 두 데이터 프레임을 병합한다.
- default는 how = left이다.
In [62]:
num_df1 = pd.DataFrame({
'Class1' : [1, 2, 3, 4],
'Class2' : [5, 6, 7, 8]
})
str_df = pd.DataFrame({
'Class1' : ['John', 'Doe'],
'Class2' : ['Cat', 'Dog']
})
join_df = pd.DataFrame({
'Class3' : [9, 10, 11, 12],
})
#concat
result = pd.concat([num_df1, str_df])
#join
result.join(join_df)
#result 데이터프레임에 index 0와 index 1이 2개가 있어서 Class 3의 index 0와 1의 값인 9와 10이 2번 join됨
Out[62]:
Class1 | Class2 | Class3 | |
---|---|---|---|
0 | 1 | 5 | 9 |
0 | John | Cat | 9 |
1 | 2 | 6 | 10 |
1 | Doe | Dog | 10 |
2 | 3 | 7 | 11 |
3 | 4 | 8 | 12 |
In [25]:
index_label = ['a', 'b', 'c', 'd']
num_df1_a = pd.DataFrame(
{'Class1' : [1, 2, 3, 4],
'Class2' : [5, 6, 7, 8]},
index = index_label #index값에 label을 부여한다.
)
join_df_a = pd.DataFrame(
{'Class3' : [9, 10, 11, 12]},
index = index_label
)
num_df1_a.join(join_df_a)
Out[25]:
Class1 | Class2 | Class3 | |
---|---|---|---|
a | 1 | 5 | 9 |
b | 2 | 6 | 10 |
c | 3 | 7 | 11 |
d | 4 | 8 | 12 |
In [71]:
join_df_b = pd.DataFrame(
{'Class3' : [9, 10, 11, 12]},
index = ['a', 'B', 'c', 'D']
)
num_df1_a.join(join_df_b) #만약 index가 불일치하면 join할 데이터프레임쪽 값이 NaN으로 처리된다.
Out[71]:
Class1 | Class2 | Class3 | |
---|---|---|---|
a | 1 | 5 | 9.0 |
b | 2 | 6 | NaN |
c | 3 | 7 | 11.0 |
d | 4 | 8 | NaN |
- num_df1의 a b c d 인덱스 중 join_df_b에도 있는 a와 c는 제대로 Class3의 값을 가져올 수 있었다.
- 그러나 b와 d는 num_df1의 데이터프레임에 없는 인덱스이기 때문에 NaN로 처리되었다.
In [36]:
result.join(join_df, how = 'outer')
Out[36]:
Class1 | Class2 | Class3 | |
---|---|---|---|
0 | 1 | 5 | 9 |
0 | John | Cat | 9 |
1 | 2 | 6 | 10 |
1 | Doe | Dog | 10 |
2 | 3 | 7 | 11 |
3 | 4 | 8 | 12 |
- merge
- 열(column)을 기준으로 두 데이터 프레임을 병합한다.
- default는 how = inner이다.
In [57]:
df_A_B = pd.DataFrame({'판매월': ['1월', '2월', '3월', '4월'],
'제품A': [100, 150, 200, 130],
'제품B': [90, 110, 140, 170]})
df_A_B
Out[57]:
판매월 | 제품A | 제품B | |
---|---|---|---|
0 | 1월 | 100 | 90 |
1 | 2월 | 150 | 110 |
2 | 3월 | 200 | 140 |
3 | 4월 | 130 | 170 |
In [58]:
df_C_D = pd.DataFrame({'판매월': ['1월', '2월', '3월', '4월'],
'제품C': [112, 141, 203, 134],
'제품D': [90, 110, 140, 170]})
df_C_D
Out[58]:
판매월 | 제품C | 제품D | |
---|---|---|---|
0 | 1월 | 112 | 90 |
1 | 2월 | 141 | 110 |
2 | 3월 | 203 | 140 |
3 | 4월 | 134 | 170 |
In [49]:
#df_A_B.join(df_C_D) 중복되는 열(판매월)이 있어서 오류가 발생함
In [63]:
df_A_B.merge(df_C_D) #defalutsms inner이다.
Out[63]:
판매월 | 제품A | 제품B | 제품C | 제품D | |
---|---|---|---|---|---|
0 | 1월 | 100 | 90 | 112 | 90 |
1 | 2월 | 150 | 110 | 141 | 110 |
2 | 3월 | 200 | 140 | 203 | 140 |
3 | 4월 | 130 | 170 | 134 | 170 |
- how옵션: join과 merge의 데이터 병합방식 옵션
- left join: 왼쪽 데이터프레임(A)를 기준으로 조인한다. A의 모든 데이터를 가져오고, B에 없는 A의 데이터는 NaN으로 나타낸다.
- right join: 오른쪽 데이터프레임(B)를 기준으로 조인한다. B의 모든 데이터를 가져오고, A에 없는 B의 데이터는 NaN으로 나타낸다.
- inner join: 교집합 데이터를 가져온다. 양쪽에 공통으로 있는 값만 가져온다.
- outer join: 합집합 데이터를 가져온다. 각각 없는 데이터는 NaN으로 나타낸다.
In [65]:
df_left = pd.DataFrame({'key':['A','B','C'], 'left': [1, 2, 3]})
df_left
Out[65]:
key | left | |
---|---|---|
0 | A | 1 |
1 | B | 2 |
2 | C | 3 |
In [66]:
df_right = pd.DataFrame({'key':['A','B','D'], 'right': [4, 5, 6]})
df_right
Out[66]:
key | right | |
---|---|---|
0 | A | 4 |
1 | B | 5 |
2 | D | 6 |
In [68]:
#inner, 교집합
df_left.merge(df_right, how = 'inner', on = 'key') #merge의 경우 디폴트임
Out[68]:
key | left | right | |
---|---|---|---|
0 | A | 1 | 4 |
1 | B | 2 | 5 |
key의 교집합인 A와 B만 가져오고 그에 해당되는 값만 가져옴
In [72]:
#outer, 합집합
df_left.merge(df_right, how = 'outer', on = 'key')
Out[72]:
key | left | right | |
---|---|---|---|
0 | A | 1.0 | 4.0 |
1 | B | 2.0 | 5.0 |
2 | C | 3.0 | NaN |
3 | D | NaN | 6.0 |
In [76]:
#left
df_left.merge(df_right, how = 'left', on = 'key')
Out[76]:
key | left | right | |
---|---|---|---|
0 | A | 1 | 4.0 |
1 | B | 2 | 5.0 |
2 | C | 3 | NaN |
- left를 다 가져옴. right는 left에 있는 것만
In [75]:
#right
df_left.merge(df_right, how = 'right', on = 'key')
Out[75]:
key | left | right | |
---|---|---|---|
0 | A | 1.0 | 4 |
1 | B | 2.0 | 5 |
2 | D | NaN | 6 |
- right를 다 가져옴. left는 right에 있는 것만
'IT학습 > Library' 카테고리의 다른 글
[pandas] 데이터프레임 정보 보기, 수정하기, groupby (0) | 2024.01.18 |
---|---|
[pandas] csv파일 입출력, 데이터값 수정, concat/merge (0) | 2024.01.17 |
[pandas] loc 기본, 기술통계량 (0) | 2024.01.17 |
[pandas] DataFrame 기본연산, 기본 기술통계 (0) | 2024.01.12 |
[pandas] Series 데이터 구조, 날짜 데이터 (0) | 2024.01.12 |