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 만족
'파이썬완전정복-Pandas DataFrame > 13. 축 및 레이블' 카테고리의 다른 글
Pandas DataFrame 13-09 인덱스 리셋 (reset_index) (0) | 2022.01.27 |
---|---|
Pandas DataFrame 13-08 인덱스 변경 (reindex_like) (0) | 2022.01.27 |
Pandas DataFrame 13-06 접미사/접두사 (suffix / prefix) (0) | 2022.01.27 |
Pandas DataFrame 13-05 레이블명 변경 (set_axis) (0) | 2022.01.26 |
Pandas DataFrame 13-04 열을 인덱스로 설정 (set_index) (0) | 2022.01.26 |