Pandas
[Pandas / 기초] 판다스 데이터병합 - concat, merge
씨주
2024. 1. 11. 16:06
📍 데이터병합
✅ concat()
: pd.concat([df1, df2], axis, join, ignore_index=True/False)
- axis : 0(default값) 행방향 / 1 열방향 결합
- join : 'inner' / 'outer'(default값)
- ignore_index=True : index 초기화
In [1]:
import pandas as pd
import numpy as np
df1=pd.DataFrame(
np.arange(6).reshape(3,2),
index=['a','b','c'],
columns=['데이터1','데이터2']
)
df1
Out[1]:

In [2]:
df2=pd.DataFrame(
5+np.arange(4).reshape(2,2),
index=['a','c'],
columns=['데이터2','데이터4']
)
df2
Out[2]:

In [3]:
pd.concat([df1, df2], axis=1)
Out[3]:

In [4]:
pd.concat([df1, df2], axis=0)
Out[4]:

In [5]:
pd.concat([df1,df2], axis=1, join='inner')
Out[5]:

In [6]:
pd.concat([df1,df2], axis=0, join='inner')
Out[6]:

In [7]:
test = pd.concat([df1,df2], axis=1, join='inner', keys=['x','y'])
test
Out[7]:

In [8]:
test.x.데이터1
Out[8]:
a 0
c 4
Name: 데이터1, dtype: int64
✅ merge()
: 공통된 key값(column)을 가지고 있을 시 병합 가능
pd.merge(df1, df2, how)
- how : left, right, outer, inner(default값)
In [9]:
df1 = pd.DataFrame({
'고객명': ['박세리', '이대호', '손흥민', '김연아', '마이클조던'],
'생년월일': ['1980-01-02', '1982-02-22', '1993-06-12', '1988-10-16', '1970-03-03'],
'성별': ['여자', '남자', '남자', '여자', '남자']})
df1
Out[9]:

In [10]:
df2 = pd.DataFrame({
'고객명': ['김연아', '박세리', '손흥민', '이대호', '타이거우즈'],
'연봉': ['2000원', '3000원', '1500원', '2500원', '3500원']})
df2
Out[10]:

In [11]:
# how='inner'(defalut) : df1, df2 중복된 요소만 병합
pd.merge(df1, df2)
Out[11]:

In [12]:
# how='left' : df1(left) 기준으로 병합
pd.merge(df1, df2, how='left')
Out[12]:

In [13]:
# how='right' : df2(right) 기준으로 병합
pd.merge(df1, df2, how='right')
Out[13]:

In [14]:
# how='outer' : df1, df2의 모든 데이터 병합
pd.merge(df1, df2, how='outer')
Out[14]:

: 병합하려는 column의 이름이 다른 경우
pd.merge(df1, df2, left_on='df1_column', right_on='df2_column')
In [15]:
df1 = pd.DataFrame({
'이름': ['박세리', '이대호', '손흥민', '김연아', '마이클조던'],
'생년월일': ['1980-01-02', '1982-02-22', '1993-06-12', '1988-10-16', '1970-03-03'],
'성별': ['여자', '남자', '남자', '여자', '남자']})
df1
Out[15]:

In [16]:
df2 = pd.DataFrame({
'고객명': ['김연아', '박세리', '손흥민', '이대호', '타이거우즈'],
'연봉': ['2000원', '3000원', '1500원', '2500원', '3500원']})
df2
Out[16]:

In [17]:
pd.merge(df1, df2, left_on='이름', right_on='고객명')
Out[17]:

: 이름이 같은 column이 여러개 있는 경우
이름이 같아도 키가 되면 안되는 열이 있을 때 on 인수로 기준열을 명시
pd.merge(df1, df2, on='column')
In [18]:
df1 = pd.DataFrame({
'이름': ['박세리', '이대호', '손흥민', '김연아', '마이클조던'],
'생년월일': ['1980-01-02', '1982-02-22', '1993-06-12', '1988-10-16', '1970-03-03'],
'데이터': ['여자', '남자', '남자', '여자', '남자']})
df1
Out[18]:

In [19]:
df2 = pd.DataFrame({
'이름': ['김연아', '박세리', '손흥민', '이대호', '타이거우즈'],
'데이터': ['2000원', '3000원', '1500원', '2500원', '3500원']})
df2
Out[19]:

In [20]:
# 데이터 column은 값의 의미가 다름(키로 사용되면 안됨)
# 기준열을 on을 통해 직접 지정(반환 결과에 동일 필드명이 있을 경우 column_x, column_y로 변경해서 표현
pd.merge(df1,df2, on='이름')
Out[20]:

: index를 기준으로 병합
pd.merge(df1, df2, left_index=True/False, right_index=True/False)
In [21]:
df1 = pd.DataFrame([[1.,2.],[3.,4.],[5.,6.]],
index=['봄','여름','겨울'],
columns=['서울','부산'])
df1
Out[21]:

In [22]:
df2 = pd.DataFrame([[7.,8.],[9.,10.],[11.,12.],[13.,14.]],
index=['초여름','여름','가을','겨울'],
columns=['대구','광주'])
df2
Out[22]:

In [23]:
# 기준이 모두 index로 처리되어 있는 경우 index는 기존 index를 사용
pd.merge(df1, df2, left_index=True, right_index=True, how='outer')
Out[23]:

✅ join()
: df1.join(df2, how)
- how : left, right, outer, inner(default값)
In [24]:
df1.join(df2, how='outer')
Out[24]:
