반응형

13-07 인덱스 변경 (reindex)

DataFrame.reindex(labels=None, index=None, columns=None, axis=None,method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)

 

개요


reindex 메서드는 인덱스를 새 인덱스로 덮어씌우고 내용을 채우는 메서드 입니다.

 

사용법


기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.reindex(labels=None, index=None, columns=None, axis=None,method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)
labels : 변경할 값입니다. labels인수를 이용할 경우 axis인수를 통해 축을 지정해줘야합니다. 추가된 index의 경우 NaN을 요소로 갖습니다.
index / columns : 변경할 값입니다. 행과 열을 미리 지정해줍니다. 추가된 index의 경우 NaN을 요소로 갖습니다.
method : {bfill / ffill / nearest이 결측치를 채울 규칙입니다.

ffill : 바로 전 값으로 결측치를 채웁니다.
bfill : 바로 뒤 값으로 결측치를 채웁니다.
nearest : 근처의 유효값으로 결측치를 채웁니다.
※ 결측치를 채울 때 값의 전/후 값을 기준으로하는것이 아닌 인덱스의 전/후 인덱스를 기준으로 합니다.

copy : 사본을 생성할지 여부입니다.
level : Multi Index의 경우 레벨을 선택할 수 있습니다.
fill_value : 결측값을 이 값으로 변경할 수 있습니다.
limit : method인수를 사용할 경우 몇개까지 변경할지 제한할 수 있습니다
tolerance : method인수를 사용할 때 index가 다를 경우 허용 범위 입니다.
│변경 전 인덱스 - 변경 후 인덱스│≤ tolerance 를 만족하게 method 적용 허용 범위를 정할 수 있습니다. 자세한건 예시 참고바랍니다.

반응형

 

예시


먼저 3x4 짜리 DataFrame 객체를 만들겠습니다.

idx = [3,6,11]
col = ['col1','col2','col3','col4']
data = [[1,2,3,4],[2,4,6,8],[3,6,9,12]]
df = pd.DataFrame(data,idx,col)
print(df)
>>
    col1  col2  col3  col4
3      1     2     3     4
6      2     4     6     8
11     3     6     9    12

기본적인 사용법(+fill_value인수)
기본적으로 새 index가 될 list를 형성하고 labels / axis나 index / columns를 사용해서 적용 할 수 있습니다.
labels / axis를 이용할 경우

col2 = ['col1','idx2','idx3','col4']
print(df.reindex(labels=col2,axis=1)) # labels로 변경값을 정해주면 axis를 이용해 적용할 축을 지정해줘야함.
>>
    col1  idx2  idx3  col4
3      1   NaN   NaN     4
6      2   NaN   NaN     8
11     3   NaN   NaN    12

index / columns를 이용할 경우

print(df.reindex(columns=col2)) # index나 columns를 이용해 대상 축에 변경값을 바로 적용할 수 있다.
>>
    col1  idx2  idx3  col4
3      1   NaN   NaN     4
6      2   NaN   NaN     8
11     3   NaN   NaN    12

fill_value를 설정하면 NaN을 원하는 값으로 지정하여 변경할 수 있습니다.

print(df.reindex(columns=col2,fill_value='-'))
>>
    col1 idx2 idx3  col4
3      1    -    -     4
6      2    -    -     8
11     3    -    -    12

method 와 limit의 사용
method를 이용하면 결측치를 앞/뒤/근처의 인덱스를 기준으로 변경이 가능합니다.
먼저 기존 열에 새 열을 reindex메서드를 이용해 추가해보겠습니다.

col3 = ['col0','col1','col2','col3','col4','col5','col6','col7']
print(df.reindex(columns=col3))
>>
    col0  col1  col2  col3  col4  col5  col6  col7 #새로 추가된 열은 NaN을 가진다.
3    NaN     1     2     3     4   NaN   NaN   NaN
6    NaN     2     4     6     8   NaN   NaN   NaN
11   NaN     3     6     9    12   NaN   NaN   NaN

method='bfill'인 경우 뒤의 열의 값을 가져옵니다.

print(df.reindex(columns=col3,method='bfill'))
>>
    col0  col1  col2  col3  col4  col5  col6  col7 # col0의 경우 뒤의 열인 col1의 값을 가져옴. 
3      1     1     2     3     4   NaN   NaN   NaN # col5, col6, col7의 경우 뒤의 열이 없으니 변경 불가. 
6      2     2     4     6     8   NaN   NaN   NaN
11     3     3     6     9    12   NaN   NaN   NaN

method='ffill'인 경우 앞의 열의 값을 가져옵니다.

print(df.reindex(columns=col3,method='ffill'))
>>
    col0  col1  col2  col3  col4  col5  col6  col7 # col0의 경우 앞에 열이 없으므로 변경 불가
3    NaN     1     2     3     4     4     4     4 # col5, col6, col7의 경우 앞의 열의 값을 가져옴
6    NaN     2     4     6     8     8     8     8
11   NaN     3     6     9    12    12    12    12

limit는 method로 변경할 열의 갯수를 제한할 수 있습니다.

print(df.reindex(columns=col3,method='ffill',limit=2))
>>
    col0  col1  col2  col3  col4  col5  col6  col7 # ffill으로 변경할 열의 수를 2로 제한하였기때문에 col5, col6만 변경됨.
3    NaN     1     2     3     4     4     4   NaN
6    NaN     2     4     6     8     8     8   NaN
11   NaN     3     6     9    12    12    12   NaN


tolerance 인수의 사용
│변경 전 인덱스 - 변경 후 인덱스│≤ tolerance 를 만족하게 method 적용 허용 범위를 정할 수 있습니다. 

tolerance=1인 경우

idx2 = [4, 8, 14]
print(df.reindex(index=idx2,method='ffill',tolerance=1))
>>
    col1  col2  col3  col4
4    1.0   2.0   3.0   4.0 # │3-4│=1 만족
8    NaN   NaN   NaN   NaN # │6-8│ = 2 불만족
14   NaN   NaN   NaN   NaN # │11-14│ = 3 불만족

tolerance=2인 경우

idx2 = [4, 8, 14]
print(df.reindex(index=idx2,method='ffill',tolerance=2))
>>
    col1  col2  col3  col4
4    1.0   2.0   3.0   4.0 # │3-4│=1 만족
8    2.0   4.0   6.0   8.0 # │6-8│=2 만족
14   NaN   NaN   NaN   NaN # │11-14│=3 불만족

tolerance=3인 경우

idx2 = [4, 8, 14]
print(df.reindex(index=idx2,method='ffill',tolerance=3))
>>
    col1  col2  col3  col4
4      1     2     3     4 # │3-4│=1 만족
8      2     4     6     8 # │6-8│=2 만족
14     3     6     9    12 # │11-14│=3 만족
반응형

+ 최근 글