08-05. 객체 병합_결측제어 가능 (align)
DataFrame.align(other, join='outer', axis=None, level=None, copy=True, fill_value=None, method=None, limit=None, fill_axis=0, broadcast_axis=None)
개요
align메서드는 두 객체를 특정 기준들에 맞추어 정렬하는 메서드입니다.
두개의 데이터를 튜플 형태로 반환한다는것을 반드시 명심하시기 바랍니다.
인수들에 따라 다양한 구현이 가능하므로 아래 사용법을 참고 바랍니다.
사용법
self.align(other, join='outer', axis=None, level=None, copy=True, fill_value=None, method=None, limit=None, fill_axis=0, broadcast_axis=None)
other : self와 함께 정렬할 객체 입니다.
join : {inner / left / right / outer} 정렬 기준이 될 인덱스 입니다. inner이면 교집합, left면 self의 인덱스, right면 other의 인덱스, outer이면 합집합으로 인덱스를 사용합니다.
axis : {0 : index / 1 : columns} 정렬할 레이블입니다. 기본값으로 두 축 모두 정렬합니다.
level : multi index의 경우 실행할 수준(level)을 설정합니다.
copy : 사본을 생성할지의 여부입니다.
fill_value : 결측치를 어떤 값으로 채울지의 여부입니다. 기존 객체에 포함된 결측치의 경우는 바뀌지 않습니다.
method : {ffill / bfill} 결측치를 어떻게 채울지 여부입니다. ffill의 경우 위의값과 동일하게, bfill의 경우 아래 값과 동일하게 채웁니다.
limit : 결측치를 몇개나 채울지 여부입니다. limit에 설정된 갯수만큼만 결측치를 변경합니다.
fill_axis : {0 : index / 1 : columns} method와 limit를 가로로 적용할지 세로로 적용할지 여부입니다.
broadcast_axis : {0 : index / 1 : columns} 어느 축을 기준으로 브로드캐스트할지 여부입니다.
브로드캐스트란 서로 차원이 다른 두 객체에 대해서 저차원 데이터의 차원을 고차원 데이터에 맞추는 과정입니다.
예시
기본 사용법
먼저 일부 레이블을 공유하는 3x3짜리 데이터 2개를 만들어보겠습니다.
전체적으로 보면 아래와 같습니다.(빨강이 df1, 파랑이df2, 녹색이 레이블이 겹치는구간)
편의를 위해 겹치는 부분의 값을 동일하게 했습니다.
두개의 데이터를 튜플 형태로 반환하기 때문에, 달라도 상관없습니다.
n=np.NaN
col1 = ['col1','col2','col3']
row1 = ['row1','row2','row3']
data1 = [[1,2,3],[5,6,7],[9,n,11]]
col2 = ['col2','col3','col4']
row2 = ['row3','row4','row5']
data2 = [[10,11,12],[14,n,16],[18,19,20]]
df1 = pd.DataFrame(data1,row1,col1)
df2 = pd.DataFrame(data2,row2,col2)
print(df1)
>>
col1 col2 col3
row1 1 2.0 3
row2 5 6.0 7
row3 9 NaN 11
print(df2)
>>
col2 col3 col4
row3 10 11.0 12
row4 14 NaN 16
row5 18 19.0 20
join 인수의 사용을 통한 레이블 설정
join 인수를 이용해 {outer : 합집합 / left : df1기준 / right : df2기준 / inner : 교집합} 인 index로 출력합니다.
두개의 데이터를 튜플 형태로 반환하기 때문에 리스트 슬라이싱으로 따로 print를 진행해보겠습니다.
outer로 출력시 레이블이 df1과 df2 모두의 합집합으로 사용되고 있는것을 알 수 있습니다.
print(df1.align(df2,join='outer')[0])
print(df1.align(df2,join='outer')[1])
>>
col1 col2 col3 col4
row1 1.0 2.0 3.0 NaN
row2 5.0 6.0 7.0 NaN
row3 9.0 NaN 11.0 NaN
row4 NaN NaN NaN NaN
row5 NaN NaN NaN NaN
col1 col2 col3 col4
row1 NaN NaN NaN NaN
row2 NaN NaN NaN NaN
row3 NaN 10.0 11.0 12.0
row4 NaN 14.0 NaN 16.0
row5 NaN 18.0 19.0 20.0
left로 출력시 df1의 레이블만 사용되는 것을 알 수 있습니다.
print(df1.align(df2,join='left')[0])
print(df1.align(df2,join='left')[1])
>>
col1 col2 col3
row1 1 2.0 3
row2 5 6.0 7
row3 9 NaN 11
col1 col2 col3
row1 NaN NaN NaN
row2 NaN NaN NaN
row3 NaN 10.0 11.0
right로 출력시 df2의 레이블만 사용되는 것을 알 수 있습니다.
print(df1.align(df2,join='right')[0])
print(df1.align(df2,join='right')[1])
>>
col2 col3 col4
row3 NaN 11.0 NaN
row4 NaN NaN NaN
row5 NaN NaN NaN
col2 col3 col4
row3 10 11.0 12
row4 14 NaN 16
row5 18 19.0 20
inner로 출력시 레이블이 df1과 df2 모두의 교집합으로 사용되고 있는것을 알 수 있습니다.
print(df1.align(df2,join='inner')[0])
print(df1.align(df2,join='inner')[1])
>>
col2 col3
row3 NaN 11
col2 col3
row3 10 11.0
axis 인수의 사용을 통한 정렬 축 설정
axis인수를 통해 정렬을 진행 할 축을 정할 수 있습니다. 기본적으로 두축 모두 입니다.
df1에 대해서만 inner로 출력하여 확인해보겠습니다.
axis를 0으로 하였을 경우 행 기준 inner인 row3만 정렬되었습니다.
print(df1.align(df2,join='inner',axis=0)[0])
>>
col1 col2 col3
row3 9 NaN 11
axis를 1으로 하였을 경우 열 기준 inner인 col2, col3만 정렬되었습니다.
print(df1.align(df2,join='inner',axis=1)[0])
>>
col2 col3
row1 2.0 3
row2 6.0 7
row3 NaN 11
fill_value를 사용한 결측치 입력
fill_value를 사용해서 결측치를 원하는 값으로 변경이 가능합니다.
단, 기존 객체에 입력되어있던 결측치의 경우 변경되지 않습니다.
print(df1.align(df2,join='outer',fill_value='X')[0])
print(df1.align(df2,join='outer',fill_value='X')[1])
>>
col1 col2 col3 col4
row1 1 2.0 3 X
row2 5 6.0 7 X
row3 9 NaN 11 X
row4 X X X X
row5 X X X X
col1 col2 col3 col4
row1 X X X X
row2 X X X X
row3 X 10 11.0 12
row4 X 14 NaN 16
row5 X 18 19.0 20
method / limit인수를 사용한 결측치 보정
method인수는 {ffill / bfill}를 이용해 위쪽 또는 아래쪽 값으로 결측치 보정이 가능합니다.
limit인수의 경우는 method인수를 통해 결측치 보정할 때, 몇개의 값을 보정할지 설정합니다.
ffill로 입력 시 결측값을 바로 위의 값과 동일하게, bfill로 입력 시 결측값을 바로 아래 값과 동일하게 변경 된것을 확인할 수 있습니다.
print(df1.align(df2,join='outer',method='ffill')[0])
print(df1.align(df2,join='outer',method='bfill')[1])
>>
col1 col2 col3 col4
row1 1.0 2.0 3.0 NaN
row2 5.0 6.0 7.0 NaN
row3 9.0 6.0 11.0 NaN
row4 9.0 6.0 11.0 NaN
row5 9.0 6.0 11.0 NaN
col1 col2 col3 col4
row1 NaN 10.0 11.0 12.0
row2 NaN 10.0 11.0 12.0
row3 NaN 10.0 11.0 12.0
row4 NaN 14.0 19.0 16.0
row5 NaN 18.0 19.0 20.0
limit 설정시 각 레이블에 대해서 아래와 같이 설정한 갯수만 변경 됩니다.
print(df1.align(df2,join='outer',method='bfill',limit=1)[1])
>>
col1 col2 col3 col4
row1 NaN NaN NaN NaN
row2 NaN 10.0 11.0 12.0
row3 NaN 10.0 11.0 12.0
row4 NaN 14.0 19.0 16.0
row5 NaN 18.0 19.0 20.0
fill_axis 인수의 사용
fill_axis는 method및 limit를 어느축 기준으로 실행할지 여부입니다. 즉, 가로로 할지 세로로할지 여부입니다.
print(df1.align(df2,join='outer',method='ffill',fill_axis=0)[0])
print(df1.align(df2,join='outer',method='ffill',fill_axis=1)[0])
>>
col1 col2 col3 col4
row1 1.0 2.0 3.0 NaN
row2 5.0 6.0 7.0 NaN
row3 9.0 6.0 11.0 NaN
row4 9.0 6.0 11.0 NaN
row5 9.0 6.0 11.0 NaN
col1 col2 col3 col4
row1 1.0 2.0 3.0 3.0
row2 5.0 6.0 7.0 7.0
row3 9.0 9.0 11.0 11.0
row4 NaN NaN NaN NaN
row5 NaN NaN NaN NaN
'파이썬완전정복-Pandas DataFrame > 08. 결합' 카테고리의 다른 글
Pandas DataFrame 08-06. 업데이트 (update) (0) | 2022.01.23 |
---|---|
Pandas DataFrame 08-04. 객체병합 (merge) (0) | 2022.01.23 |
Pandas DataFrame 08-03. 인덱스기준 병합 (join) (0) | 2022.01.23 |
Pandas DataFrame 08-02. 다른 객체로 결측치 덮어쓰기 (combine_first) (0) | 2022.01.23 |
Pandas DataFrame 08-01. 함수를 이용한 열 단위 결합 (combine) (0) | 2022.01.22 |