반응형

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
반응형

+ 최근 글