[Pandas] 데이터프레임 연결/병합 : concat(), merge(), join(), append()

cybergangster·2022년 6월 23일
0

Pandas

목록 보기
12/20
post-thumbnail

비슷한 듯 다른 문법이 너무 많다. 데이터프레임 병합하는 panda 함수들...

[1] concat() : 데이터프레임을 물리적으로 연결시켜 준다.

  • 인자값(파라미터)으로 리스트.
  • 아무 옵션 없이 합치면 각 데이터프레임의 인덱스를 그대로 사용하고 빈 부분은 NaN
pd.concat([df1, df2], axis=0, ignore_index=True, join='inner')

# axis=0(디폴트) : 행, 밑으로 붙임
# axis=1 : 열, 오른쪽으로 붙임

# ignore_index=True : 인덱스 재배열

# join='inner' : null값(행과 열 등이 맞지 않아 생기는 NaN)을 제외한 교집합
# join 옵션은 outer join이 디폴트 : null(NaN)값이 나옴
  • 시리즈 데이터와 데이터프레임 병합
    - 시리즈 데이터를 하나의 열이라고 생각
df=pd.Series(['s0','s1','s2','s3'], name='Ss'] # name : 컬럼명
pd.concat([df1, Ss], axis=1) # 열을 붙이는 거니 axis=1
  • 시리즈 데이터끼리의 병합
df1=pd.Series(['s0','s1','s2','s3'], name='Ss1']
df2=pd.Series(['s4','s5','s6','s7'], name='Ss2']

pd.concat([Ss1,Ss2], axis=0, ignore_index=True)) # 행으로 병합
pd.concat([Ss1,Ss2], axis=1)) # 열로 병합

[2] merge() : 병합하고자 하는 두 데이터프레임의 고유값(key)을 기준으로 병합

df1=pd.DataFrame({
   'data1':range(4),
   'key':list('aabc')
})

df2=pd.DataFrame({
   'data2':range(3),
   'key':list('acd')
})
   data1   key
0      0    a
1      1    a
2      2    b
3      3    c

   data2  key
0      0    a
1      1    c
2      2    d    # 데이터 예시
// pd.merge(df_left, df_right, how='inner', on=None) -> default
pd.merge(df1, df2) # how='inner'
# 공통되지 않은 key값에 대해서 생략
# 공통된 key값이 중복되어 합쳐짐(아래 예시)
# data1 key data2
#     0   a     0  
#     1   a     0  
#     ...

pd.merge(df1, df2, on='key', how='outer')
# 공통되지 않는 값들은 NaN으로 채워짐

pd.merge(df1, df2, on='key', how='left')
# df1을 기준으로 df2에 해당 key값이 없는 경우 NaN
# key 'd'는 df1에 없으므로 df2에서 생략됨
pd.merge(df1, df2, on='key', how='right')
# left랑 반대

[3] join() : 인덱스 기준으로 데이터프레임 병합

// df1.join(df2, how='left') -> default
df1= pd.DataFrame({'A':[1,2,3,4]},index=['a','b','c','d'])
df2 = pd.DataFrame({'B':[5,6,7,8]},index=['b','c','g','f'])
df1.join(df2) # how='left'
# 인덱스는 df1, df2에 없는 df1 인덱스의 값은 NaN
# how='right' 옵션은 바로 위 코드 반대

df2.join(df1)
# 바로 위 코드 참고, B컬럼부터 출력됨

df1.join(df2, how='inner') # 교집합
df1.join(df2, how='outer') # 합집합

// join()하려는 두 데이터프레임이 중복된 열을 가지고 있을 때 오류가 발생할 수 있다.
// lsuffix('')/rsuffix('') 옵션을 주어 기존 열에 접미사를 붙일 수 있다.
// 예를 들어 두 데이터프레임에 'col'이라는 이름의 열이 있을 경우,
// lsuffix('_1'), rsuffix('_2') 옵션을 주면,
// 'col_1', 'col_2'로 열 이름이 변경되어 출력된다.

[4] append() :

df1 = pd.DataFrame({'A':[10,20,30,40]},index=['a','b','c','d'])
df2 = pd.DataFrame({'A':[10,20,30,40]},index=['e','f','g','h'])
df3 = pd.DataFrame({'B':[1,2,3,4]},index=['a','b','c','d'])

//단순 결합, 없는 건 NaN으로 처리되고 결합

# df1과 df2는 인덱스만 다름
df1.append(df2,sort=False) 
// df2가 df1 아래로 붙음

# df1과 df3는 인덱스만 같음
df1.append(df3,sort=False)
// df3이 df1 오른쪽으로 붙음, 없는 값은 NaN처리

# df2와 df3는 인덱스와 컬럼이 다름
df2.append(df3,sort=False)
// df3이 df2 오른쪽으로 붙음, 없는 값은 NaN처리

// 인덱스 없애려면 ignore_index=True 옵션 적용

0개의 댓글